檢查項(xiàng)目依賴(lài)的retrofit和rxjava版本是否一致,大多數(shù)java.lang.IllegalStateException: Fatal Exception thrown on Scheduler.Worker thread.都是由于這個(gè)問(wèn)題造成的
創(chuàng)新互聯(lián)公司始終致力于在企業(yè)網(wǎng)站建設(shè)領(lǐng)域發(fā)展。秉承“創(chuàng)新、求實(shí)、誠(chéng)信、拼搏”的企業(yè)精神,致力為企業(yè)提供全面的網(wǎng)絡(luò)宣傳與技術(shù)應(yīng)用整體策劃方案,為企業(yè)提供包括“網(wǎng)站建設(shè)、成都響應(yīng)式網(wǎng)站建設(shè)公司、手機(jī)網(wǎng)站建設(shè)、微信網(wǎng)站建設(shè)、微信小程序、購(gòu)物商城網(wǎng)站建設(shè)、平臺(tái)網(wǎng)站建設(shè)秉承"和諧、參與、激情"的文化,與客戶(hù)和合作伙伴齊心協(xié)力一起成長(zhǎng),共同發(fā)展。
2. compile 'com.squareup.retrofit2:adapter-rxjava:2.1.0'
compile 'com.squareup.retrofit2:retrofit:2.1.0'
把版本調(diào)成一樣的,重新gradle一下應(yīng)該就闊以了
1. 首先定義帶泛型的返回結(jié)果,Retrofit API 的原生結(jié)果映射為這種形式:
class ResultT {
String ResultMessage;
int ResultCode;
T Data;
}
2. 處理錯(cuò)誤的方法和 @朱詩(shī)雄 前輩方法差不多,放到作為靜態(tài)方法放到 RetroUtil 里,這里 ApiException 為自己定義的一個(gè)異常,放入錯(cuò)誤碼和錯(cuò)誤信息(錯(cuò)誤碼不止一個(gè)):
static T ObservableT flatResult(ResultT result) {
return Observable.create(subscriber - {
switch (result.ResultCode) {
case Constants.SUCCESS_CODE:
subscriber.onNext(result.Data);
break;
case Constants.ERROR_CODE:
subscriber.onError(new ApiException(result.ResultCode, result.ResultMessage);
break;
default:
// ...
}
subscriber.onCompleted();
}
});
}
3. 在 API 包裝類(lèi)對(duì)于上述 ResultT 格式的返回結(jié)果,統(tǒng)一調(diào)用 flatMap(RetroUtil::flatResult) 后的 API。這樣每個(gè) API 的返回結(jié)果就是 ObservableData 的形式并且在 errorHandler 中統(tǒng)一處理錯(cuò)誤了。
// 接口方法
ObservableResultUser getUserInfo();
// 包裝后的方法
ObservableUser getUserInfo() {
return mApi.getUserInfo.flatMap(RetroUtil::flatResult);
}
// 調(diào)用時(shí)
apiWrapper.getUserInfo()
.subscrible(user - {
// 處理正常邏輯
}, error - {
// 處理錯(cuò)誤邏輯和異常,這里封裝時(shí)通常也會(huì)統(tǒng)一處理,
// 提供一個(gè)默認(rèn)的 Action1Throwable 參數(shù),彈出
// throwable 的 message 打印日志等
});
RxJava要比EventBus的應(yīng)用更廣泛,EventBus僅僅是作為一種消息的傳遞工具,但是RxJava里面幾乎可以做任何事情。
如果是Android開(kāi)發(fā)的話(huà),可以使用RxAndroid,這是對(duì)RxJava的一個(gè)擴(kuò)展,結(jié)合sqare公司的retrofit可以很輕松的完成網(wǎng)絡(luò)的訪問(wèn)。
我們知道,在Android中異步操作一般使用AsycTask來(lái)完成,但是AsycTask有很多缺點(diǎn),如不能方便的終止任務(wù)的執(zhí)行等。
RxAndroid完全可以替代AsycTask來(lái)完成各種異步操作,而且還有BindActivity和BindFragment方法,你根本不需要考慮異步操作時(shí)的Activity和Fragment的生命周期問(wèn)題,還有更加強(qiáng)大的的鏈?zhǔn)秸{(diào)用,可以使程序很簡(jiǎn)潔。
EventBus有個(gè)缺點(diǎn)就是凡是使用了EventBus的類(lèi)都不能進(jìn)行混淆了,否則Evnetbus就找不到OnEvent方法了。
以上,推薦使用RxAndroid。