概述
单读 APP的网络框架部分采用 Dagger2+Retrofit2.0 + Rxjava模式, 网络框架的初始化在 Application中,请先了解 Dagger2
的简单在
引入依赖
Retrofit2.0 + Rxjava的依赖
在 build.gradle(app)
分别引入Retrofit2.0 和 Rxjava 的依赖
compile 'io.reactivex:rxjava:1.0.14'
compile 'io.reactivex:rxandroid:1.0.1'
compile 'com.squareup.retrofit2:retrofit:2.1.0'
compile 'com.squareup.retrofit2:adapter-rxjava:2.1.0'
compile 'com.squareup.retrofit2:converter-gson:2.1.0'
依赖
Dagger2 依赖的引入,请参考Dagger2初探
引入权限
在 AndroidManifest.xml
中引入 网络权限 以及存储等权限
日志模块
日志采用的是Logger
日志库,详情围观Github地址
新建 MyApplication
,在Oncreate
中初始化日志模块如下:
private void initLogger() {
// 日志策略
FormatStrategy formatStrategy = PrettyFormatStrategy.newBuilder()
.tag("tuionf")
.build();
//初始化
Logger.addLogAdapter(new AndroidLogAdapter(formatStrategy));
}
网络框架搭建
先看一下单读APP中网络的使用模式 : SplashPresenter.java 中的getSplash() 方法
apiService.getSplash("android","1.3.0",time,deviceId)
.subscribeOn(Schedulers.io())
.observeOn(Schedulers.io())
.subscribe(new Subscriber() {
@Override
public void onCompleted() {
Logger.e("load splash onCompleted");
}
@Override
public void onError(Throwable e) {
Logger.e("load splash Error"+e.toString());
}
@Override
public void onNext(SplashEntity splashEntity) {
});
直接使用的 apiService
来调用网络请求的方法,也就是说我们网络框架搭建完成的标志就是对外提供一个 apiService
对象,单读中使用的是Dagger2 来处理的,所以需要对Dagger2 有一定的了解。不了解的请参考Dagger2初探 ,其实按照最简单的例子大概敲一边,能跑起来就可以继续往下看了。
创建ApiService实例
public interface ApiService {}
如代码所示,ApiService 是一个接口,可以在里面实现网络请求的方法,我们先暂时不写。
创建Module—NetModule
在Dagger2中 Module
的作用就是提供生成依赖对象的,在此处就是提供 ApiService
的,在 di\module
目录下创建 NetModule.java 。 (没有di\module 目录的话请创建)
- 该类需要用 @Module 注解
@Module
public class NetModule {
}
- 需要提供
ApiService
对象,就需要先提供一个方法来提供该对象 ,同时需要以参数形式传入Retrofit
实例,以便创建网络请求的实例- 该方法需要
@Provides
注解,表明需要提供这样一个实例 - 该方法需要
@Singleton
注解,表明需要提供的是一个单例
- 该方法需要
- 创建
ApiService
对象,需要Retrofit
实例,所以需要提供方法创建Retrofit
实例 - 同理,需要提供方法创建
OkHttpClient
实例
NetModule.java 完整代码如下:
@Module
public class NetModule {
public static final String BASE_URL = "http://static.owspace.com/";
@Provides
@Singleton
public OkHttpClient provideOkHttpClient(){
HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor();
loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
OkHttpClient client = new OkHttpClient.Builder()
.connectTimeout(30, TimeUnit.SECONDS)
.connectTimeout(20, TimeUnit.SECONDS)
.readTimeout(20,TimeUnit.SECONDS)
.addInterceptor(loggingInterceptor)
.build();
return client;
}
@Provides
@Singleton
public Retrofit provideRetrofit(OkHttpClient client){
Retrofit retrofit = new Retrofit.Builder()
.client(client)
.baseUrl(BASE_URL)
.addConverterFactory(StringConverterFactory.create())
.addConverterFactory(GsonConverterFactory.create(EntityUtils.gson))//
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.build();
return retrofit;
}
@Provides
@Singleton
public ApiService provideApiService(Retrofit retrofit){
return retrofit.create(ApiService.class);
}
}
创建Component—NetComponent
NetComponent 是一个接口, 用@Singleton
@Component
注解标注,同时 modules 依赖上面刚刚创建的 NetModule.class,代码如下
NetComponent.java
@Singleton
@Component (modules = NetModule.class)
public interface NetComponent {
ApiService getApiService();
}
Make Project
在 androidstudio中 build—Make Project,或者直接快捷键 Ctrl+F9,编译完成之后会生出 以 Dagger 开头的 Component,比如,我们上面写的是 **NetComponent **,生成了类名就为 DaggerNetComponent。这个类我们可以直接使用
获取 ApiService实例
在MyApplication
中,使用上面生成的 DaggerNetComponent
private void initNet() {
netComponent = DaggerNetComponent.builder()
.netModule(new NetModule())
.build();
}
至此,网络层的搭建就算基本完成了,接下来我们会用这个实例来调用API获得数据
使用网络实例
创建启动图的bean
http://static.owspace.com/static/picture_list.txt?client=android&version=1.3.0&time=1467864021&device_id=866963027059338
根据上述接口,可以获得启动图的返回数据 ,根据数据创建
SplashEntity.java
public class SplashEntity {
private int count;
private String status;
private int time;
private List images;
public int getCount() {
return count;
}
public void setCount(int count) {
this.count = count;
}
public String getStatus() {
return status;
}
public void setStatus(String status) {
this.status = status;
}
public int getTime() {
return time;
}
public void setTime(int time) {
this.time = time;
}
public List getImages() {
return images;
}
public void setImages(List images) {
this.images = images;
}
}
构建网络请求
public interface ApiService {
@GET("static/picture_list.txt")
Observable getSplash(@Query("client") String client,@Query("version") String version,@Query("time") Long time,@Query("device_id") String deviceId);
}