Retrofit网络框架的封装使用
来源:互联网 发布:ps淘宝详情页制作步骤 编辑:程序博客网 时间:2024/05/18 03:27
retrofit的使用实例(封装以后比较简单明了)
//联网登录请求的使用 Map<String, String> map = new HashMap<>(); map.put("userName" , phone); map.put("passWord" , pwd); System.out.println(phone + "----" + pwd); UseCase addressNetUpdate = new LoginUpdate(map); addressNetUpdate.execute(new ResponseSubscriber<UpdateNetBean>() { @Override public void onFailure(Throwable e) { e.printStackTrace(); loginView.loginError("服务器繁忙,请稍后重试"); } @Override public void onSuccess(UpdateNetBean updateNetBean) { int infoCode = updateNetBean.getInfoCode(); if (infoCode == 200){ loginView.loginSuccess(phone); }else{ loginView.loginError("商户号或密码错误"); } } });
- LoginUpdate类的使用
/** * Created by shiqiang on 2017/2/23. */public class LoginUpdate extends UseCase { public Map<String, String> map; public LoginUpdate(Map<String,String> map){ super(); this.map = map; }//Rxjava中的被观察者:Observable @Override protected Observable buildUseCaseObservable() { return RetrofitServiceFactory.getAppService().updateNetCall(map); }}
- 上面返回的Observable 在何时被调用.execute()的时候封装了,代码如下
public abstract class UseCase { private final ThreadExecutor threadExecutor; private final PostExecutionThread postExecutionThread; private Subscription subscription = Subscriptions.empty(); protected UseCase() { //分别对应线程池跟主线程,下面贴出代码 this.threadExecutor = JobExecutor.getInstance(); this.postExecutionThread = UIThread.getInstance(); } //调取时候的代码,使用Rxjava订阅者模式 public void execute(Subscriber UseCaseSubscriber) { this.subscription = this.buildUseCaseObservable()//调取子类 .subscribeOn(Schedulers.from(threadExecutor))//网络请求在子线程中,创建的线程池,代码下面贴在下面 .observeOn(postExecutionThread.getScheduler())//返回的结果在主线程中回调给view做数据的处理,使用单例模式封装主线程UI进程 .subscribe(UseCaseSubscriber); } public void unSubscribe() { if (!subscription.isUnsubscribed()) { subscription.unsubscribe(); } } protected abstract Observable buildUseCaseObservable();}
- 创建buildUseCaseObservable的原理为:
@Override protected Observable buildUseCaseObservable() { return RetrofitServiceFactory.getAppService().updateNetCall(map); }/** * 根据不同功能模块返回不同的Service接口对象 */public class RetrofitServiceFactory { //网络请求头 private static final String Base_URL = UserContentURL.URL_SERVER; public static NetworkApi getAppService(){ return AppRetrofit.getNewsRetrofit(NetworkApi.class,Base_URL); }}public class AppRetrofit { public static <T> T getNewsRetrofit(Class<T> clazz, String baseUrl) { if (TextUtils.isEmpty(baseUrl)) { throw new IllegalArgumentException("BaseUrl cannot be null"); }// /** * 判断是否需要缓存数据,默认为false,可以用单利在每次请求之前设置值 */// if (true){ if (App.getIsChach()){ Retrofit retrofit = new Retrofit.Builder() .baseUrl(baseUrl) //刚刚添加进来的请求头 .client(getCacheOkHttpClient(App.getApplication())) //使用缓存,Interceptor截获每次网络请求用于缓存数据 .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) //添加Rxjava //添加Gson解析 .addConverterFactory(GsonConverterFactory.create()) .build(); return retrofit.create(clazz); }else{ Retrofit retrofit = new Retrofit.Builder() .baseUrl(baseUrl) .client(getOKHttpClient()) .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) //添加Gson解析 .addConverterFactory(GsonConverterFactory.create()) .build(); return retrofit.create(clazz); } }//网络请求时间的设置 private static OkHttpClient getOKHttpClient(){ return new OkHttpClient.Builder()// .connectTimeout(20000, TimeUnit.MILLISECONDS) .connectTimeout(10000, TimeUnit.SECONDS) .writeTimeout(10000, TimeUnit.SECONDS) .readTimeout(10000, TimeUnit.SECONDS) .build(); } //缓存的代码 private static OkHttpClient getCacheOkHttpClient(final Context context){ final File baseDir = context.getCacheDir(); final File cacheDir = new File(baseDir, "HttpResponseCache");// Timber.e(cacheDir.getAbsolutePath()); Cache cache = new Cache(cacheDir, 10 * 1024 * 1024); //缓存可用大小为10M //Retrofit网络请求时候的截获类Interceptor Interceptor REWRITE_CACHE_CONTROL_INTERCEPTOR = new Interceptor() { @Override public Response intercept(Chain chain) throws IOException { Request request = chain.request(); if(!NetWorkUtils.isNetWorkAvailable(context)){ request = request.newBuilder() .cacheControl(CacheControl.FORCE_CACHE) .build(); } Response originalResponse = chain.proceed(request); if (NetWorkUtils.isNetWorkAvailable(context)) { int maxAge = 60; //在线缓存一分钟 return originalResponse.newBuilder() .removeHeader("Pragma") .removeHeader("Cache-Control") .header("Cache-Control", "public, max-age=" + maxAge) .build(); } else { int maxStale = 60 * 60 * 24 * 4 * 7; //离线缓存4周 return originalResponse.newBuilder() .removeHeader("Pragma") .removeHeader("Cache-Control") .header("Cache-Control", "public, only-if-cached, max-stale=" + maxStale) .build(); } } }; return new OkHttpClient.Builder() .addNetworkInterceptor(REWRITE_CACHE_CONTROL_INTERCEPTOR) .addInterceptor(REWRITE_CACHE_CONTROL_INTERCEPTOR) .cache(cache) .connectTimeout(10000, TimeUnit.SECONDS) .writeTimeout(10000, TimeUnit.SECONDS) .readTimeout(10000, TimeUnit.SECONDS) .build(); }}
- 观察者,请求以后的回调,由于 ResponseSubscriber extends Subscriber ,儿Subscriber
//使用了Gson可以直接转化对象addressNetUpdate.execute(new ResponseSubscriber<UpdateNetBean>() { @Override public void onFailure(Throwable e) { e.printStackTrace(); loginView.loginError("服务器繁忙,请稍后重试"); } @Override public void onSuccess(UpdateNetBean updateNetBean) { int infoCode = updateNetBean.getInfoCode(); if (infoCode == 200){ loginView.loginSuccess(phone); }else{ loginView.loginError("商户号或密码错误"); } } });
[源码github地址](“https://github.com/weiaiCmeng/RetrofitTest“)
0 0
- Retrofit网络框架的封装使用
- retrofit网络请求的简单封装使用
- Retrofit+Rxjava网络封装框架
- 基于retrofit的网络框架的终极封装
- 如何封装自己的网络框架(RxJava+okHttp+Retrofit)
- 最流行的网络请求框架Rxjava2+Retrofit完美封装
- 网络请求框架Retrofit的基本使用
- Retrofit网络请求框架的基本使用
- Android网络框架Retrofit的综合使用
- Android Retrofit 网络框架的使用
- Retrofit的使用封装
- 浅谈Android网络封装框架Retrofit
- 封装Retrofit + okhttp + rxjava网络请求框架
- Retrofit网络框架入门使用
- 如何封装自己的网络框架 -进阶封装 (RxJava+okHttp+Retrofit)
- Retrofit框架的使用
- Retrofit框架的使用
- Retrofit网络通信库简单封装使用
- Jmeter 使用
- 概念模型
- No WebApplicationContext found: no ContextLoaderListener registered?报错解决
- 1579 泽泽在巴西
- C++之多态的原理及其分析
- Retrofit网络框架的封装使用
- Keil调试总结
- ES3:ElasticSearch 索引
- 阅读volley的源码HttpStack
- Uva 10972
- anaconda管理环境
- 懒虫小鑫
- 哈希表算法实现
- windows 安装python3.6(numpy,scipy,pandas,matplotlib,scikit-learn)