原文鏈接:http://www.reibang.com/p/f565a687ba75
1.麻煩:相信很多同學都用的Retrofit作為網(wǎng)絡請求框架了,確實方便椿争。但我覺得對于回調(diào)結果的處理就很麻煩了沛硅,如下:
private void IndexTextAdOld() {
dataProvider.shop.indexTextAd().subscribe(new Observer<BaseResponse<IndexTextAd>>() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(BaseResponse<IndexTextAd> indexTextAdBaseResponse) {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onComplete() {
}
});
}
這面的Observer
回調(diào)包含了四個方法,但我只想關心成功后的結果趁啸,就是onNext
中的內(nèi)容师郑,有的說可以用Consumer
但這樣編譯器會爆灰色今缚,而且并沒有處理異常情況:
灰色警告
2.封裝:為了只關心成功數(shù)據(jù),所以我們還是得封裝一下:
public abstract class OnSuccessAndFailListener<T> extends DisposableObserver<T> {
Dialog loadDialog;
SwipeRefreshLayout refresh;
private void showLoading(){
if (loadDialog!=null) loadDialog.show();
if (refresh!=null) refresh.setRefreshing(true);
}
private void dismissLoading(){
if (loadDialog!=null) loadDialog.dismiss();
if (refresh!=null) refresh.setRefreshing(false);
}
public OnSuccessAndFailListener() {}
public OnSuccessAndFailListener(Dialog loadDialog) {
this.loadDialog=loadDialog;
}
public OnSuccessAndFailListener(SwipeRefreshLayout refresh) {
this.refresh=refresh;
}
@Override
protected void onStart() {
super.onStart();
showLoading();
}
@Override
public void onNext(T t) {
dismissLoading();
try {
BaseResponse baseResponse = (BaseResponse) t;
if (baseResponse.getStatus()==1){
onSuccess(t);
}else {
onErr(baseResponse.getMsg());
}
} catch (Exception e) {
onError(e);
onErr(e.getMessage());
}
}
@Override
public void onError(Throwable e) {
dismissLoading();
e.printStackTrace();
String message;
if (e instanceof SocketTimeoutException){
message="SocketTimeoutException:網(wǎng)絡連接超時惯疙!";
}else if (e instanceof ConnectException){
message="ConnectException:網(wǎng)絡無法連接翠勉!";
} else if (e instanceof HttpException) {
message="HttpException:網(wǎng)絡中斷妖啥,請檢查您的網(wǎng)絡狀態(tài)霉颠!";
} else if (e instanceof UnknownHostException) {
message="UnknownHostException:網(wǎng)絡錯誤,請檢查您的網(wǎng)絡狀態(tài)荆虱!";
}else {
message = e.getMessage();
}
onErr(message);
}
@Override
public void onComplete() {}
protected abstract void onSuccess(T t);
//很多異常不需要反饋給用戶蒿偎,所以不必抽象,如果需要異常信息怀读,重寫即可
protected void onErr(String msg){
L.e("網(wǎng)絡數(shù)據(jù)異常:"+msg);
}
}
其中BaseResponse為我們自己定義的網(wǎng)絡數(shù)據(jù)回調(diào)類基類诉位,這里
我們是狀態(tài)碼為1的時候,說明數(shù)據(jù)是正確的菜枷。有的可能是200苍糠,看后端各自定義來更改。
3.使用
dataProvider.shop.indexTextAd()
.subscribe(new OnSuccessAndFailListener<BaseResponse<IndexTextAd>>() {
@Override
protected void onSuccess(BaseResponse<IndexTextAd> indexTextAdBaseResponse) {
}
});
特點如下:
- 1.只關注正確數(shù)據(jù)的回調(diào)處理
- 2.異常情況統(tǒng)一處理啤誊,如需單獨處理岳瞭,重寫
onErr()
方法即可 - 3.加載進度一參傳入,無需關心加載開始結束
注意:新項目可能會遇到OnSuccessAndFailListener里面的泛型不自動補充的問題蚊锹,那么你多半是沒有引入java8的支持瞳筏。
android {
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
}
最后寫代碼如下寫就可以了:
封裝的回調(diào)