一:叙述retrofit2+dagger框架特点:
retrofit框架:主要将访问网络的业务代码进行抽取成用函数+注解的方式,方便访问网络!
dagger框架:主要将activity层的复杂的业务逻辑代码进行分离到Component,module,presenter层!
二:配置过程 1:在项目层的build.gradle文件中添加代码如下:
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:2.2.1'
classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
2:在app层的build.gradle文件中添加设置如下:
apply plugin: 'com.android.application'
//需要在mvp中的moudule中使用apt
apply plugin: 'com.neenbedankt.android-apt'
android {
compileSdkVersion 24
buildToolsVersion "24.0.3"
......
}
dependencies {
......
//dagger的依赖
compile 'com.google.dagger:dagger:2.4'
apt 'com.google.dagger:dagger-compiler:2.4'
provided 'org.glassfish:javax.annotation:10.0-b28'
//添加retrofit的依赖
compile 'com.squareup.retrofit2:retrofit:2.1.0'
//将retrofit与gson进行关联
compile 'com.squareup.retrofit2:converter-gson:2.1.0'
compile 'com.squareup.retrofit2:adapter-rxjava:2.0.2'
...........
//butterknife依赖
compile 'com.jakewharton:butterknife:5.1.1'
}
3:具体的包的结构如下
4:代码的构建过程:
4.1:业务层中的访问网络业务构建 将单,多文件上传为实例,在ResponseInfoAPI类中结合Retrofit2.0的注解的方式创建文件上传相关的方法
public interface ResponseInfoApi {
/**
* 进行单文件上传
* @param descritpion
* @param file
* @return
*/
@Multipart
@POST(Constants.UPLOAD)
Call<ResponseInfo> upload(@Part("description") RequestBody descritpion, @Part MultipartB ody.Part file);
/**
* 通过多个MultipartBody.Part集合的方式上传多个文件
* @param parts
* @return
*/
@Multipart
@POST(Constants.UPLOAD)
Call<ResponseInfo> uploadFilesWithParts(@Part List<MultipartBody.Part> parts);
/**
* 通过RequestBody进行上传多个文件
* @param multipartBody
* @return
*/
@POST(Constants.UPLOAD)
Call<ResponseInfo> uploadFilesWithRequestBody(@Body MultipartBody multipartBody);
}
4.2 对业务层中的MainActivityPresenter类中的"上传文件具体业务代码"实现: 构造函数:引入MainActivity类,同时结合OKhttp,创建ResponseInfoApi的实例:
public class MainActivityPresenter {
private MainActivity mainActivity;
private ResponseInfoApi responseInfoApi;
int DEFAULT_TIMEOUT=30;
public MainActivityPresenter(MainActivity mainActivity) {//MainActivityPresenter的构造函数
this.mainActivity=mainActivity;
//进行创建ResponseApi,通过okHttpClient进行设置相关超时时间
OkHttpClient okHttpClient = new OkHttpClient.Builder()
.connectTimeout(DEFAULT_TIMEOUT, TimeUnit.SECONDS)
.writeTimeout(DEFAULT_TIMEOUT, TimeUnit.SECONDS)
.readTimeout(DEFAULT_TIMEOUT, TimeUnit.SECONDS)
.build();//根据baseUrl,gson格式转换工厂,okHttpClient创建实例
responseInfoApi=new Retrofit.Builder().baseUrl(Constants.BASE_URL).//
addConverterFactory(GsonConverterFactory.create()).//
client(okHttpClient).build().create(ResponseInfoApi.class);
}
4.3 构建模块层 传入MainActivity实例,向外提供获取MainActivity,MainActivityPresenter实例的入口
@Module
public class MainActivityModule {
private MainActivity mainActivity;
public MainActivityModule(MainActivity mainActivity) {
this.mainActivity=mainActivity;
}
@Provides
MainActivity provideMainActivity() {
return mainActivity;
}
@Provides
MainActivityPresenter provideMainActivityPresenter() {
return new MainActivityPresenter(mainActivity);
}
}
4.4 构建组件层 结合@Component注解,创建in方法将MainActivity进行绑定!
//通过接口创建实例的代码和目标实例进行关联在一起
@Component(modules= MainActivityModule.class)
public interface MainActivityComponent {
void in(MainActivity mainActivity);
}
4.5 在MainActivity层与组件成进行关联:
DaggerMainActivityComponent daggerMainActivityComponent=
(DaggerMainActivityComponent)DaggerMainActivityComponent.builder().mainActivityModule(n ew MainActivityModule(this)).build();
daggerMainActivityComponent.in(this);
具体的代码的链接:https://github.com/zhangyang520/Retrofit.git