android novate乱码,Android RxJava+Retrofit2+RxBinding
Android RxJava+Retrofit2+RxBinding
本文原創,轉載請注明出處。歡迎關注我的 簡書。
安利一波我寫的開發框架:MyScFrame喜歡的話就給個Star
前言:
之前寫了一篇名為Android 手把手教你使用Retrofit2的文章,只是單純并簡單的介紹了下Retrofit2的使用,現在我們把它跟RxJava以及RxBinding關聯起來,看看效果如何
添加依賴
RxBinding的依賴比較麻煩,是按控件包區分的,我這邊只用到了基礎包也就是android.widget.所以只引入了compile 'com.jakewharton.rxbinding:rxbinding:1.0.0'
//全新網絡請求框架Rxjava+RxAndroid+ReTrofit2+okHttp3
compile 'com.tamic.novate:novate:1.2.7'
compile 'com.squareup.retrofit2:retrofit:2.1.0'
compile 'com.squareup.retrofit2:converter-gson:2.1.0'
compile 'com.squareup.retrofit2:adapter-rxjava:2.1.0'
//日志攔截器
compile 'com.squareup.okhttp3:logging-interceptor:3.5.0'
compile 'io.reactivex:rxjava:1.2.4'
compile 'io.reactivex:rxandroid:1.2.1'
compile 'org.ligboy.retrofit2:converter-fastjson-android:2.1.0'
//RxBinding
compile 'com.jakewharton.rxbinding:rxbinding:1.0.0'
// compile 'com.jakewharton.rxbinding:rxbinding-support-v4:1.0.0'
// compile 'com.jakewharton.rxbinding:rxbinding-appcompat-v7:1.0.0'
// compile 'com.jakewharton.rxbinding:rxbinding-design:1.0.0'
// compile 'com.jakewharton.rxbinding:rxbinding-recyclerview-v7:1.0.0'
開始關聯
MyRetrofit2Service差異
在使用RxJava之前是這樣的
@POST()
Call> post(@Url String url, @QueryMap Map map);
使用了RxJava之后是這樣的
@POST()
Observable> rxPost(@Url String url, @QueryMap Map map);
MyRetrofit2調用方法上的差異
在使用RxJava之前是這樣的
/**
* 異步調用
*/
public void getEnqueue() {
Call> call = mApi.post(NEWS_URI, params);
call.enqueue(new Callback>() {
@Override
public void onResponse(Call> call, Response> response) {
//處理請求成功
Log.e("OkHttp", "處理成功請求 response = " + response.body().toString());
}
@Override
public void onFailure(Call> call, Throwable t) {
//處理請求失敗
Log.e("OkHttp", "處理失敗請求");
}
});
// cancelCall(call);
}
使用了RxJava之后是這樣的
public void RxJavaGetEnqueue(Subscriber subscriber) {
Observable observable = mApi.rxPost(NEWS_URI, params)
.map(new HttpResultFunc());
toSubscribe(observable, subscriber);
}
private void toSubscribe(Observable o, Subscriber s) {
o.subscribeOn(Schedulers.io())//設置事件觸發在非主線程
.unsubscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())//在主線程處理返回數據
.subscribe(s);
}
/**
* 用來統一處理Http的resultCode,并將HttpResult的Data部分剝離出來返回給subscriber
*
* @param Subscriber真正需要的數據類型,也就是Data部分的數據類型
*/
private class HttpResultFunc implements Func1, T> {
@Override
public T call(HttpResult httpResult) {
Log.e("OkHttp", "HttpResultFunc httpResult = " + httpResult.toString());
if ("200".equals(httpResult.getStatus_code()) && httpResult.isSuccess()) {
return httpResult.getData();
}
throw new ApiException(httpResult.getStatus_code());
}
}
初看代碼量變多了,沒錯,是變多了,但是誰叫他最近比較火呢,而且目前我只是實現比較簡單的場景,還沒發揮出RxJava的真正功效呢.
這里需要說下HttpResultFunc方法的作用,好用就好用在這里,這里我是根據網絡請求的code跟success兩個參數判斷是否是成功的,如果是成功返回,那就返回data,如果是錯誤的話,自己寫了個ApiException類是用來處理錯誤信息的
/**
* Created by caihan on 2017/1/14.
*/
public class ApiException extends RuntimeException {
public static final int WRONG_1 = 100;
public static final int WRONG_2 = 101;
public ApiException(int resultCode) {
this(getApiExceptionMessage(resultCode));
}
public ApiException(String detailMessage) {
super(detailMessage);
}
/**
* 由于服務器傳遞過來的錯誤信息直接給用戶看的話,用戶未必能夠理解
* 需要根據錯誤碼對錯誤信息進行一個轉換,在顯示給用戶
*
* @param code
* @return
*/
private static String getApiExceptionMessage(int code) {
String message = "";
switch (code) {
case WRONG_1:
message = "錯誤1";
break;
case WRONG_2:
message = "錯誤2";
break;
default:
message = "未知錯誤";
}
return message;
}
}
界面上調用方式的變化
之前是這樣的
MyRetrofit2.getInstance().getEnqueue();
現在是這樣子的
private void rxGet() {
MyRetrofit2.getInstance().RxJavaGetEnqueue(new Subscriber() {
@Override
public void onCompleted() {
Log.e("OkHttp", "rxGet onCompleted");
}
@Override
public void onError(java.lang.Throwable e) {
Log.e("OkHttp", "rxGet onError e= " + e.toString());
}
@Override
public void onNext(News news) {
Log.e("OkHttp", "rxGet onNext news= " + news.toString());
}
});
}
用RxBinding處理頻繁點擊問題
開發中大家都會遇到這類問題,用戶不(gui)小(cai)心(xin)點擊了N次Button,導致Button相應了N次,之前我是寫了個DoubleClick類,專門處理此類事件,相信大家也都會,現在有了RxBinding,解放了
RxView.clicks(mButton)
.throttleFirst(1, TimeUnit.SECONDS)
.subscribe(new Action1() {
@Override
public void call(Void o) {
Log.d("OkHttp", "clickAction call");
rxGet();
}
});
throttleFirst()方法就是處理這種不小心事件,它會把設置時間內的其他響應事件過濾掉,怎么樣,是不是很好用呀...其他的控件如何處理我這邊就不寫了,大家感興趣的話可以看看相關資料
資料
總結
響應式開發我也還在摸索當中,這里沒做過多的封裝,因為還有很多地方沒搞懂,最近也是一直在找相關的資料.如果大家在其他地方看到了一些相關的優秀文章,可以分享給我,謝謝
總結
以上是生活随笔為你收集整理的android novate乱码,Android RxJava+Retrofit2+RxBinding的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 兴城到黑山客车时刻表兴城到黑山最早几点车
- 下一篇: 捷达vs72021款支持无线carpla