retrofit的注解是编译前还是编译后
1个回答
2016-08-06 · 知道合伙人生活技巧行家
关注
展开全部
首先是抽象的基类publicabstractclassBaseApi{publicstaticfinalStringAPI_SERVER="服务器地址"privatestaticfinalOkHttpClientmOkHttpClient=newOkHttpClient();privatestaticRetrofitmRetrofit;protectedstaticRetrofitgetRetrofit(){if(Retrofit==null){Contextcontext=Application.getInstance().getApplicationContext();//设定30秒超时mOkHttpClient.setConnectTimeout(30,TimeUnit.SECONDS);//设置拦截器,以用于自定义Cookies的设置mOkHttpClient.networkInterceptors().add(newCookiesInterceptor(context));//设置缓存目录FilecacheDirectory=newFile(context.getCacheDir().getAbsolutePath(),"HttpCache");Cachecache=newCache(cacheDirectory,20*1024*1024);mOkHttpClient.setCache(cache);//构建RetrofitmRetrofit=newRetrofit.Builder()//配置服务器路径.baseUrl(API_SERVER+"/")//设置日期解析格式,这样可以直接解析Date类型.setDateFormat("yyyy-MM-ddHH:mm:ss")//配置转化库,默认是Gson.addConverterFactory(ResponseConverterFactory.create())//配置回调库,采用RxJava.addCallAdapterFactory(RxJavaCallAdapterFactory.create())//设置OKHttpClient为网络客户端.client(mOkHttpClient).build();}returnmRetrofit;}}1234567891011121314151617181920212223242526272829303132333435然后是Cookies拦截器publicclassCookiesInterceptorimplementsInterceptor{privateContextcontext;publicCookiesInterceptor(Contextcontext){this.context=context;}//重写拦截方法,处理自定义的Cookies信息@OverridepublicResponseintercept(Chainchain)throwsIOException{Requestrequest=chain.request();RequestcompressedRequest=request.newBuilder().header("cookie",CookieUtil.getCookies(context)).build();Responseresponse=chain.proceed(compressedRequest);CookieUtil.saveCookies(response.headers(),context);returnresponse;}}123456789101112131415161718CookieUtil则是一些自定义解析和生成方法以及SharedPreferences的存取,代码略然后是Api类publicclassUserApiextendsBaseApi{//定义接口privateinterfaceUserService{//GET注解不可用@FormUrlEncoded,要用@Query注解引入请求参数@GET("user/user_queryProfile")ObservablequeryProfile(@Query("userId")intuserId);//POST方法没有缓存,适用于更新数据@FormUrlEncoded@POST("user/user_updateUserName")ObservableupdateUserName(@Field("userName")StringuserName);}protectedstaticfinalUserServiceservice=getRetrofit().create(UserService.class);//查询用户信息接口publicstaticObservablequeryProfile(intuserId){returnservice.queryProfile(userId);}//更新用户名接口publicstaticObservableupdateUserName(StringuserName){returnservice.updateUserName(userName);}}123456789101112131415161718192021222324再就是将Retrofit的响应消息经过Gson解析成期望的数据结构,称之为Model类上文的BaseResp和UserProfileResp则是自定义的Model假定服务器约定返回的Json格式为{"result":"结果代号,0表示成功","msg":"异常信息,仅在失败时返回数据","userInfo":{"id":"用户id","userName":"用户名名字"}}123456789那么UserProfileResp可以写成publicclassUserProfileResp{//@SerializedName是指定Json格式中的Key名//可以不写,则默认采用与变量名一样的Key名@SerializedName("userInfo")privateUserProfileModeluserInfo;publicUserProfileModelgetUserInfo(){returnuserInfo;}}12345678910UserProfileModel则是具体的数据结构publicclassUserProfileModel{privateintuserId;privateStringuserName;publicStringgetUserName(){returnuserName;}}12345678需要注意的是,如果没有使用@SerializedName指定Key名,当工程被混淆时,变量名会被混淆得与期望的Key名不符。因此需要将这类Model类统一放到一个工程目录,再在proguard-project文件中加入排除项//不混淆Model类-keepclasscom.xxx.model.xxx.**{*;}12最后是实际调用publicvoidgetProfile(intuserId){UserApi.queryProfile(userId).subscribeOn(Schedulers.io()).subscribe(newSubscriber(){@OverridepublicvoidonCompleted(){}@OverridepublicvoidonError(Throwablee){}@OverridepublicvoidonNext(UserProfileRespuserProfileResp){}});}
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询