rxjava android.jar,Android中的Retrofit+OkHttp+RxJava缓存架构使用

本文介绍了如何在Android中结合RxJava和Retrofit进行网络请求,并利用OkHttp实现缓存策略。首先展示了项目依赖,然后通过ButterKnife构建基本的UI界面。接着讲解了在网络连接不可用时强制使用缓存以及在网络可用时设置缓存过期时间的方法。最后,展示了如何使用Retrofit接口进行网络请求并订阅响应。
摘要由CSDN通过智能技术生成

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中的线程问题。

下面先搭建一个基本的页面,页面很简单,先来看文件目录结构

498a89917de079cd95f7b837791a440b.png

activity_main.xml的代码如下:

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">

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"/>

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"/>

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(){

}

}

注意不要忘记加网络权限

缓存配置

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", "public, 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() {

@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 getDaily();

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值