前言
Rxjava2这种通过观察者模式来处理异步问题,使得网络请求变得更容易,目前Rxjava2越来越火,也成为了不少框架用于异步处理的首选开源库。所以熟练掌握其基本用法也就成为了每个程序员应该具备的本领。
Gradle中添加依赖
//Rxjava compile 'io.reactivex.rxjava2:rxandroid:2.0.2' compile 'io.reactivex.rxjava2:rxjava:2.1.9' //网络请求 compile 'com.squareup.retrofit2:retrofit:2.3.0' // retrofit compile 'com.google.code.gson:gson:2.8.2' // gson compile 'com.squareup.retrofit2:converter-gson:2.2.0' compile 'com.jakewharton.retrofit:retrofit2-rxjava2-adapter:1.0.0'//RxJava2CallAdapterFactory适配器支持Rxjava2 // compile 'com.squareup.retrofit2:adapter-rxjava:2.0.2' RxJavaCallAdapterFactory适配器仅支持Rxjava compile 'com.squareup.okhttp3:logging-interceptor:3.1.2' compile 'com.squareup.okhttp3:okhttp:3.10.0'
注意:如果使用RxJavaCallAdapterFactory适配器则有可能出现Unable to create call adapter for io.reactivex.Observable<okhttp3.ResponseBody>这个异常。
Retrofit2接口
public interface RequestServices { @GET//定义返回的方法,返回的响应体使用了ResponseBody Observable<ResponseBody> getString(@Url String url); @FormUrlEncoded @POST Observable<ResponseBody> post(@Url String url, @FieldMap Map<String, String> params); }
关于Retrofit2的使用Retrofit2网络请求详解可以查看这篇文章
初始化Retrofit对象
在这里我只是对Retrofit做了简单处理,如果有需求可以查看一下okhttp+Retrofit的配合使用
OkHttpClient OK_HTTP_CLIENT = new OkHttpClient.Builder() .connectTimeout(60, TimeUnit.SECONDS) .build(); //获取Retrofit对象,设置地址 retrofit = new Retrofit.Builder() .baseUrl("http://localhost") .client(OK_HTTP_CLIENT)//通过okhttp对retrofit进行加强 .addConverterFactory(GsonConverterFactory.create()) .addCallAdapterFactory(RxJava2CallAdapterFactory.create())//添加Rxjava2适配器 .build();
网络请求
通过Retrofit对象创建出网络请求对象,通过该对象获取Observable对象,接下来就可以运用Rxjava的操作对数据进行处理
RequestServices requestServices = retrofit.create(RequestServices.class); Map<String, String> pamars1 = new HashMap<>(); pamars1.put("key", "value"); requestServices.post("请求url地址",pamars1)//这里我们即可获得一个Observable对象,这里我使用的是post请求 .subscribeOn(Schedulers.io())//在io线程中做请求 .observeOn(AndroidSchedulers.mainThread())//主线程显示数据 .subscribe(new Observer<ResponseBody>() { @Override public void onSubscribe(Disposable d) { } @Override public void onNext(ResponseBody responseBody) { try { Log.d(TAG,responseBody.string()); } catch (IOException e) { e.printStackTrace(); } } @Override public void onError(Throwable e) { } @Override public void onComplete() { } });
合并多个网络请求
RequestServices requestServices = retrofit.create(RequestServices.class); Map<String, String> pamars1 = new HashMap<>(); pamars1.put("key", "value"); Map<String, String> pamars2 = new HashMap<>(); pamars2.put("key", "value"); requestServices.post("请求url地址",pamars1)//这里我们即可获得一个Observable对象 .mergeWith(requestServices.post("请求url地址",pamars2))//合并两条网络请求 .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread())//主线程显示数据 .subscribe(new Observer<ResponseBody>() { @Override public void onSubscribe(Disposable d) { } @Override public void onNext(ResponseBody responseBody) { try { Log.d(TAG,responseBody.string()); } catch (IOException e) { e.printStackTrace(); } } @Override public void onError(Throwable e) { } @Override public void onComplete() { } });