Retrofit的基本用法在上一节已经介绍过了接下来我们介绍下Retrofit+RxJava的组合使用不了解Retrofit的用法的可以先看看我上篇博客的介绍
Restrofit简单入门
那如果不了解RxJava的我会在后续的课程中对RxJava进行介绍接下来我们就介绍 Retrofit+RxJava的简单应用
1.gradle环境配置
代码如下
compile 'io.reactivex.rxjava2:rxjava:2.0.0-RC1'//RxJava依赖包
compile 'com.squareup.retrofit2:retrofit:2.0.0-beta4'//Retrofit2所需要的包
compile 'com.squareup.retrofit2:converter-gson:2.0.0-beta4'//ConverterFactory的Gson依赖包
compile 'com.squareup.retrofit2:adapter-rxjava:2.0.0-beta4'//CallAdapterFactory的Rx依赖包
compile 'com.squareup.retrofit2:converter-scalars:2.0.0-beta4'//ConverterFactory的String依赖包
当我们配置完这些后运行项目可能会发生一个错误错误内容如下
Error:Execution failed for task ':app:transformResourcesWithMergeJavaResForDebug'.
> com.android.build.api.transform.TransformException: com.android.builder.packaging.DuplicateFileException: Duplicate files copied in APK META-INF/rxjava.properties
File1: C:\Users\Administrator\.gradle\caches\modules-2\files-2.1\io.reactivex\rxjava\1.1.0\748f0546d5c3c27f1aef07270ffea0c45f0c42a4\rxjava-1.1.0.jar
File2: C:\Users\Administrator\.gradle\caches\modules-2\files-2.1\io.reactivex.rxjava2\rxjava\2.0.0-RC1\3ee37bb825446a3bafac68a46f2397a8affd9b68\rxjava-2.0.0-RC1.jar
具体原因我也不是太清楚不过在我们的gradle的android目录下添加如下代码问题就解决了
packagingOptions {
exclude 'META-INF/DEPENDENCIES.txt'
exclude 'META-INF/NOTICE'
exclude 'META-INF/NOTICE.txt'
exclude 'META-INF/LICENSE'
exclude 'META-INF/LICENSE.txt'
exclude 'META-INF/rxjava.properties'
exclude 'META-INF/rxjava.PROPERTIES'
exclude 'META-INF/RXJAVA.properties'
exclude 'META-INF/RXJAVA.PROPERTIES'
exclude 'META-INF/rxjava'
exclude 'META-INF/RXJAVA'
}
环境配置完成了接下来我们要做的是网络请求处理的那一套流程了
2.首先我们要有网络请求定义的接口跟方法
public interface HttpService {
@POST("aaaa.do")
@FormUrlEncoded
Call<String> getString(@Field("currentVersion") String curVersion,
@Field("checkVersion") String checkVersion,
@Field("loginName") String loginName,
@Field("userName") String userName,
@Field("farmName") String farmName,
@Field("fw.excute.event") String eventId);
@POST("1009.do")
@FormUrlEncoded
Observable<String> getAllVedioBy(@Field("currentVersion") String curVersion,
@Field("checkVersion") String checkVersion,
@Field("loginName") String loginName,
@Field("userName") String userName,
@Field("farmName") String farmName,
@Field("fw.excute.event") String eventId);
}
大家可以看到上面的getString方法是我们标准的Restrofit的接口定义方法而下面的的定义及处理是我们的RxJava的处理方式最主要的区别就是返回的不再是一个call对象而是一个Observable
3.接下来我们要写基础的网络访问代码
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(BASE_URL)
.addConverterFactory(ScalarsConverterFactory.create())
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.build();
再接下来处理网络访问
HttpService apiService = retrofit.create(HttpService.class);
Observable<String> observable = apiService.getAllVedioBy("3.3", "4.8", "101111", "15111", "biubiu", "323A3A303A");
observable.subscribeOn(Schedulers.io())
.observeOn(Schedulers.immediate())
.subscribe(new Subscriber<String>() {
@Override
public void onCompleted() {
boolean a = false;
int ss = 1;
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(String s) {
String result = s.toLowerCase();
}
});
创建retrofit 对象的方法跟上一节提到的一样不同的是Observable observable = apiService.getAllVedioBy(…)这一段代码
其实原理很简单restrofit将处理完的网络请求不再通过自己的call对象获取了而是交给了Observable这样的话Observable就持有了网络请求的结果。
再看下面的内容 observable.subscribeOn(Schedulers.io()).observeOn(Schedulers.immediate())这段话的意思是让我们的观察者在主线程也就是immediate这个线程而subscribeOn代表是被观察者它的执行放在了io线程也就是单起个线程防止主线程卡死
.subscribe()意思是订阅的意思观察者订阅被观察者
new Subscriber() 这个相当于执行后的结果的回调接口用于处理上面一系列流程处理的结果
经历上面的过程我们的restrofit+rxjava的基本内容就处理完了但是回过头来想想还有没有可以改变的地方大多数app都是接收到的后台数据为json数据要呈现在界面上一般需要将json转换成对象然后通过对象获取内容呈现在界面上那我们做如下修改这里只处理结果内容
HttpService apiService = retrofit.create(HttpService.class);
Observable<String> observable = apiService.getAllVedioBy("3.3", "4.8", "101111", "15111", "biubiu", "323A3A303A");
observable.subscribeOn(Schedulers.io())
.observeOn(Schedulers.immediate())
.map(new Func1<String, GetVersionResult>() {
@Override
public GetVersionResult call(String s) {
Gson gson = new Gson();
return gson.fromJson(s, GetVersionResult.class);
}
})
.subscribe(new Subscriber<GetVersionResult>() {
@Override
public void onCompleted() {
boolean a = false;
int ss = 1;
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(GetVersionResult errorString) {
String result = errorString.getReturn_sts();
}
});
我们通过 .map将返回的结果集处理成了GetVersionResult 内容这样我们下面的处理也就跟着Map的转化转换成了接收GetVersionResult参数的方法了。
最后借鸿洋大神的处理截图看看大神是如何处理的