您的位置:首页 > 理论基础 > 计算机网络

rxjava+Retrofit+okhttp 实战网络请求

2017-07-12 15:09 399 查看
app 中build.gradle

compile 'io.reactivex.rxjava2:rxjava:2.1.1'
compile 'io.reactivex.rxjava2:rxandroid:2.0.1'

compile 'com.squareup.retrofit2:converter-gson:2.3.0'
compile 'com.jakewharton.retrofit:retrofit2-rxjava2-adapter:1.0.0'
compile 'com.squareup.okhttp3:okhttp:3.8.1'


写api接口

public interface ApiService {
//干货集中营
/**
* 分类数据: http://gank.io/api/data/数据类型/请求个数/第几页 * 数据类型: 福利 | Android | iOS
* 请求个数: 数字,大于0
* 第几页:数字,大于0
* eg: http://gank.io/api/data/福利/10/1 */
@GET("data/{type}/{pre_page}/{page}")
Observable<GankDataBean> getGankIoData(@Path("type") String id, @Path("page") int page, @Path("current_page") int current_page);
/**
* Create a new ApiService
*/
class Factory {
private Factory() {  }

public static ApiService createService(String baseUrl) {
//ok的配置
OkHttpClient.Builder builder = new OkHttpClient().newBuilder();
builder.readTimeout(15, TimeUnit.SECONDS);
builder.connectTimeout(15, TimeUnit.SECONDS);
//这里你可以拦截添加个公共参数什么的等等,干啥都行
builder.addInterceptor(new Interceptor() {
@Override
public Response intercept(Chain chain) throws IOException {
return null;
}
});

OkHttpClient client = builder.build();
Retrofit retrofit =
new Retrofit.Builder().baseUrl(baseUrl)
.client(client)
//Gson的转换工厂
.addConverterFactory(GsonConverterFactory.create())
//Observable的适配
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.build();
return retrofit.create(ApiService.class);
}
}
}


在Moudle中

public interface CommonImpl{
void loadSuccess(Object object);
void loadFailed();
//便于对事件的管理,在activity销毁的时候我们要中止事件,给clear掉
void addDisaposed(Disposable disposable);
}
//
public void showBannerPage(final CommonImpl listener){
ApiService.Factory.createService(Constants.API_Ganhuo)
.getGankIoData("福利",10,1)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<GankDataBean>() {
@Override
public void onSubscribe(@NonNull Disposable d) {
listener.addDisaposed(d);
}

@Override
public void onNext(@NonNull FrontpageBean frontpageBean) {
listener.loadSuccess(frontpageBean);
}

@Override
public void onError(@NonNull Throwable e) {
listener.loadFailed();
}

@Override
public void onComplete() {

}
});
}


在Activity中调用

recommendMoudle.showBannerPage(new RecommendMoudle.CommonImpl() {
@Override
public void loadSuccess(Object object) {

}

@Override
public void loadFailed() {

}

@Override
public void addDisaposed(Disposable disposable) {

}
});


最近整理的时候,把APiService中的接口部分抽出来,将网络请求部分放到另一个单独的类中,简单的封装了一下,

/**
* Created by great小海海 on 2017/7/13.
*网络请求的封装定制类
*/

public class ServiceManager {

//设缓存有效期为1天
private static long  CACHE_STALE_SEC = 60 * 60 * 24 * 1;
//查询缓存的Cache-Control设置,为if-only-cache时只查询缓存而不会请求服务器,max-stale可以配合设置缓存失效时间
private static String CACHE_CONTROL_CACHE = "only-if-cached, max-stale=" + CACHE_STALE_SEC;
private static ServiceManager mServiceManage;
private Retrofit retrofit;
public static ServiceManager getInstance(String baseUrl){
if (mServiceManage==null){
mServiceManage = new ServiceManager(baseUrl);
}
return mServiceManage;
}
private ServiceManager(String baseUrl){
//缓存目录
File files = new File(Environment.getDownloadCacheDirectory().toString(),"cache");
//缓存大小为10M
int cacheSize = 10 * 1024 * 1024;

Cache mCache = new Cache(files,cacheSize);
OkHttpClient.Builder builder = new OkHttpClient().newBuilder();
builder.readTimeout(10, TimeUnit.SECONDS);
builder.connectTimeout(10, TimeUnit.SECONDS);
builder.cache(mCache);
builder.addNetworkInterceptor(sRewriteCacheControlInterceptor);
if (BuildConfig.DEBUG) {
HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();
interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
builder.addInterceptor(interceptor);
}

OkHttpClient client = builder.build();
retrofit=
new Retrofit.Builder().baseUrl(baseUrl)
.client(client)
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.build();
}
public <T>T creat(Class<T> service){
return retrofit.create(service);
}

/**
* 这个拦截类是看别人写的,大家可以做个参考
* 云端响应头拦截器,用来配置缓存策略
* Dangerous interceptor that rewrites the server's cache-control header.
*/
private static final Interceptor sRewriteCacheControlInterceptor = new Interceptor() {

@Override
public Response intercept(Chain chain) throws IOException {
Request request = chain.request();
if (!CheckNetwork.isNetworkConnected(MyApp.getSingleInstance())){
request = request.newBuilder().cacheControl(CacheControl.FORCE_CACHE).build();
}
Response originalResponse = chain.proceed(request);

if (CheckNetwork.isNetworkConnected(MyApp.getSingleInstance())) {
//有网的时候读接口上的@Headers里的配置,你可以在这里进行统一的设置
String cacheControl = request.cacheControl().toString();
return originalResponse.newBuilder()
.header("Cache-Control", cacheControl)
//pragma也是控制缓存的一个消息头属性,要移除掉然后重新设置缓存策略
.removeHeader("Pragma")
.build();
} else {
return originalResponse.newBuilder()
.header("Cache-Control", "public, " +CACHE_CONTROL_CACHE)
.removeHeader("Pragma")
.build();
}
}
};


这样APiService中只剩了接口的定义,用法还是差不多的

原来:ApiService.Factory.createService(Constants.API_Ganhuo)

现在: ServiceManager.getInstance(Constants.API_DOUBAN).creat(ApiService.class)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: