
RxJava如何与Retrofit结合
先扔出build.gradle文件的内容
dependencIEs { compile filetree(dir: 'libs',include: ['*.jar']) testCompile 'junit:junit:4.12' compile 'com.androID.support:appcompat-v7:23.2.0' compile 'io.reactivex:rxjava:1.1.0' compile 'io.reactivex:rxandroID:1.1.0' compile 'com.squareup.retrofit2:retrofit:2.0.0-beta4' compile 'com.squareup.retrofit2:converter-gson:2.0.0-beta4' compile 'com.squareup.retrofit2:adapter-rxjava:2.0.0-beta4' compile 'com.Google.code.gson:gson:2.6.2' compile 'com.jakewharton:butterknife:7.0.1'}也就是说本文是基于RxJava1.1.0和Retrofit 2.0.0-beta4来进行的。 添加rxandroID是因为rxjava中的线程问题。
下面先搭建一个基本的页面,页面很简单,先来看文件目录结构
activity_main.xml的代码如下:
<?xml version="1.0" enCoding="utf-8"?><relativeLayout xmlns:androID="http://schemas.androID.com/apk/res/androID" xmlns:tools="http://schemas.androID.com/tools" androID:layout_wIDth="match_parent" androID:layout_height="match_parent" androID:paddingBottom="@dimen/activity_vertical_margin" androID:paddingleft="@dimen/activity_horizontal_margin" androID:paddingRight="@dimen/activity_horizontal_margin" androID:paddingtop="@dimen/activity_vertical_margin" tools:context=".activity.MainActivity"> <button androID:ID="@+ID/click_me_BN" androID:layout_wIDth="match_parent" androID:layout_height="wrap_content" androID:layout_alignParentBottom="true" androID:padding="5dp" androID:text="点我" androID:textSize="16sp"/> <TextVIEw androID:ID="@+ID/result_TV" androID:layout_wIDth="match_parent" androID:layout_height="match_parent" androID:layout_above="@ID/click_me_BN" androID:text="Hello World!" androID:textSize="16sp"/></relativeLayout>
MainActivity.java的代码如下:
package com.queen.rxjavaretrofitdemo.activity;import androID.os.Bundle;import androID.support.v7.app.AppCompatActivity;import androID.Widget.button;import androID.Widget.TextVIEw;import com.queen.rxjavaretrofitdemo.R;import butterknife.Bind;import butterknife.ButterKnife;import butterknife.OnClick;public class MainActivity extends AppCompatActivity { @Bind(R.ID.click_me_BN) button clickMeBN; @Bind(R.ID.result_TV) TextVIEw resultTV; @OverrIDe protected voID onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentVIEw(R.layout.activity_main); ButterKnife.bind(this); } @OnClick(R.ID.click_me_BN) public voID onClick() { getMovIE(); } //进行网络请求 private voID getMovIE(){ }}注意不要忘记加网络权限
<uses-permission androID:name="androID.permission.INTERNET"/>
缓存配置
app网络数据的离线缓存实现有很多种办法,例如存进数据库(保存Json使用时拿出来解析),存专有文件,或SharedPreference等等,也可以自己实现LruCache和
diskLruCache这两种缓存策略构成二级缓存(内存和磁盘)
缓存对于移动端是非常重要的存在:
减少请求次数,减小服务器压力. 本地数据读取速度更快,让页面不会空白几百毫秒。 在无网络的情况下提供数据。okhttp的缓存设计和浏览器的缓存设计差不多,可以通过添加响应头的形式进行缓存处理。
retrofit是依赖okhttp的一套RESTful架构的AndroID(Java)客户端实现
通过构造retrofit时的.clIEnt()方法更改其中的okhttp的实现,从而达到缓存的效果,在这里不介绍retrofit的具体用法。
下面是一个例子实现了有网缓存,无网络只读取缓存
file cachefile = new file(APP.getContext().getExternalCacheDir(),"ZhiBookCache"); Cache cache = new Cache(cachefile,1024*1024*50); Interceptor interceptor = new Interceptor() { @OverrIDe public Response intercept(Chain chain) throws IOException { Request request = chain.request(); if (!httpUtils.isNetworkConnected(APP.getContext())) { request = request.newBuilder() .cacheControl(CacheControl.FORCE_CACHE) .build(); } Response response = chain.proceed(request); if (httpUtils.isNetworkConnected(APP.getContext())) { int maxAge = 0 * 60; // 有网络时 设置缓存超时时间0个小时 response.newBuilder() .header("Cache-Control","public,max-age=" + maxAge) .removeheader("Pragma")// 清除头信息,因为服务器如果不支持,会返回一些干扰信息,不清除下面无法生效 .build(); } else { // 无网络时,设置超时为4周 int maxStale = 60 * 60 * 24 * 28; response.newBuilder() .header("Cache-Control",only-if-cached,max-stale=" + maxStale) .removeheader("Pragma") .build(); } return response; } }; clIEnt = new OkhttpClIEnt.Builder().cache(cache) .addInterceptor(interceptor) .build(); retrofit = new Retrofit.Builder() .baseUrl(RetrofitAPI.BASIC_DAILY) .addConverterFactory(GsonConverterFactory.create()) .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) .clIEnt(clIEnt) .build(); retrofitAPI = retrofit.create(RetrofitAPI.class);之后调用下面代码获取请求后的序列化对象
retrofitAPI.getDaily() .subscribeOn(Schedulers.io()) .observeOn(AndroIDSchedulers.mainThread()) .subscribe(new Observer<DailyBean>() { @OverrIDe public voID onCompleted() { } @OverrIDe public voID onError(Throwable e) { Log.d(TAG,e.getMessage()); } @OverrIDe public voID onNext(DailyBean bean) { Listener.onGetDailySuccess(bean); } });最后附上retrofit接口部分
@GET("news/latest")Observable<DailyBean> getDaily(); 总结 以上是内存溢出为你收集整理的Android中的Retrofit+OkHttp+RxJava缓存架构使用全部内容,希望文章能够帮你解决Android中的Retrofit+OkHttp+RxJava缓存架构使用所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)