天天看点

android中的retrofit2+okHttp+dagger框架

一:叙述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:具体的包的结构如下                              

android中的retrofit2+okHttp+dagger框架

          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