您好,登錄后才能下訂單哦!
前言
RxJava和Retrofit2用了一段時(shí)間了,寫(xiě)個(gè)小例子,分享出來(lái),有什么不對(duì)的地方還請(qǐng)大神在評(píng)論區(qū)指正。
什么是Retrofit2
官網(wǎng)是這么介紹的:
Retrofit adapts a Java interface to HTTP calls by using annotations on the declared methods to
define how requests are made。
我翻譯的可能不準(zhǔn)確,他的大概意思是說(shuō):Retrofit 是一個(gè) java 接口類,以注解的方式用于 HTTP 網(wǎng)絡(luò)請(qǐng)求。那下面我們一起來(lái)看看是怎么使用的?
發(fā)現(xiàn)問(wèn)題
最近在幫兄弟公司做一個(gè)資訊類的項(xiàng)目,使用了RxJava和Retrofit2這對(duì)黃金組合,在編寫(xiě)代碼的過(guò)程中發(fā)現(xiàn)有很多很多的網(wǎng)絡(luò)請(qǐng)求都需要做.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).onErrorReturn()
的處理,為避免這樣,需要沉思。
解決問(wèn)題
import android.util.Log; import com.wei.caiqiwang.data.entity.BaseResponse; import rx.Observable; import rx.Subscriber; import rx.Subscription; import rx.android.schedulers.AndroidSchedulers; import rx.functions.Func1; import rx.schedulers.Schedulers; public class RxNet { /** * 統(tǒng)一處理單個(gè)請(qǐng)求 */ public static <T> Subscription request(Observable<BaseResponse<T>> observable, final RxNetCallBack<T> callBack) { return observable .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .onErrorReturn(new Func1<Throwable, BaseResponse<T>>() { @Override public BaseResponse<T> call(Throwable throwable) { Log.v("LinNetError",throwable.getMessage()); callBack.onFailure(ExceptionHandle.handleException(throwable)); return null; } }) .subscribe(new Subscriber<BaseResponse<T>>() { @Override public void onCompleted() { } @Override public void onError(Throwable e) { } @Override public void onNext(BaseResponse<T> baseResponse) { if (baseResponse.getCode().equals("200")) { callBack.onSuccess(baseResponse.getData()); } else { callBack.onFailure(baseResponse.getMsg()); } } }); } /** * 統(tǒng)一處理單個(gè)請(qǐng)求沒(méi)有 msg body */ public static Subscription requestWithoutBody(Observable<BaseResponse> observable, final RxNetCallBack<String> callBack) { return observable .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .onErrorReturn(new Func1<Throwable, BaseResponse>() { @Override public BaseResponse call(Throwable throwable) { callBack.onFailure(ExceptionHandle.handleException(throwable)); return null; } }) .subscribe(new Subscriber<BaseResponse>() { @Override public void onCompleted() { } @Override public void onError(Throwable e) { } @Override public void onNext(BaseResponse baseResponse) { if (baseResponse.getCode().equals("200")) { callBack.onSuccess(baseResponse.getMsg()); } else { callBack.onFailure(baseResponse.getMsg()); } } }); } }
回調(diào)就是普通的回調(diào)
public interface RxNetCallBack<T> { /** * 數(shù)據(jù)請(qǐng)求成功 * * @param data 請(qǐng)求到的數(shù)據(jù) */ void onSuccess(T data); /** * 數(shù)據(jù)請(qǐng)求失敗 */ void onFailure(String msg); }
錯(cuò)誤異常處理(可能不全):
import android.net.ParseException; import com.google.gson.JsonParseException; import org.apache.http.conn.ConnectTimeoutException; import org.json.JSONException; import java.net.ConnectException; import retrofit2.HttpException; public class ExceptionHandle { private static final int UNAUTHORIZED = 401; private static final int FORBIDDEN = 403; private static final int NOT_FOUND = 404; private static final int REQUEST_TIMEOUT = 408; private static final int INTERNAL_SERVER_ERROR = 500; private static final int BAD_GATEWAY = 502; private static final int SERVICE_UNAVAILABLE = 503; private static final int GATEWAY_TIMEOUT = 504; public static String handleException(Throwable e) { String errorMsg; if (e instanceof HttpException) { HttpException httpException = (HttpException) e; switch (httpException.code()) { case UNAUTHORIZED: case FORBIDDEN: case NOT_FOUND: case REQUEST_TIMEOUT: case GATEWAY_TIMEOUT: case INTERNAL_SERVER_ERROR: case BAD_GATEWAY: case SERVICE_UNAVAILABLE: default: errorMsg = "網(wǎng)絡(luò)錯(cuò)誤"; break; } return errorMsg + ":" + httpException.code(); } else if (e instanceof JsonParseException || e instanceof JSONException || e instanceof ParseException) { return "解析錯(cuò)誤"; } else if (e instanceof ConnectException) { return "連接失敗"; } else if (e instanceof javax.net.ssl.SSLHandshakeException) { return "證書(shū)驗(yàn)證失敗"; } else if (e instanceof ConnectTimeoutException) { return "連接超時(shí)"; } else if (e instanceof java.net.SocketTimeoutException) { return "連接超時(shí)"; } else { return "未知錯(cuò)誤"; } } }
然后就是ApiManager:
import android.util.Log; import com.wei.demo.data.AppConstants; import java.util.concurrent.TimeUnit; import okhttp3.OkHttpClient; import okhttp3.logging.HttpLoggingInterceptor; import retrofit2.Retrofit; import retrofit2.adapter.rxjava.RxJavaCallAdapterFactory; import retrofit2.converter.gson.GsonConverterFactory; public class ApiManager { private Retrofit client; private ApiManager() { client = new Retrofit.Builder() .baseUrl(AppConstants.Base_Url_Api_Test) .client(initClient()) .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) .addConverterFactory(GsonConverterFactory.create()) .build(); } private static volatile DemoApi INSTANCE; public static DemoApi getInstance() { if (INSTANCE == null) { synchronized (ApiManager.class) { if (INSTANCE == null) { INSTANCE = new ApiManager().getApi(); } } } return INSTANCE; } private DemoApi getApi() { return client.create(DemoApi.class); } private static OkHttpClient initClient() { OkHttpClient.Builder builder = new OkHttpClient.Builder(); //聲明日志類 HttpLoggingInterceptor httpLoggingInterceptor = new HttpLoggingInterceptor(new HttpLoggingInterceptor.Logger() { @Override public void log(String message) { Log.v("NetLog", message); } }); //設(shè)定日志級(jí)別 httpLoggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY); //延時(shí) builder.addInterceptor(httpLoggingInterceptor) .connectTimeout(10, TimeUnit.SECONDS) .readTimeout(10, TimeUnit.SECONDS) .writeTimeout(10, TimeUnit.SECONDS); return builder.build(); } }
怎么用?
RxNet.request(ApiManager.getInstance().getUserMsg(map), new RxNetCallBack<List<MsgBean>>() { @Override public void onSuccess(List<MsgBean> data) { // 處理數(shù)據(jù) } @Override public void onFailure(String msg) { //出現(xiàn)了錯(cuò)誤 showToast(msg); } });
Demo https://github.com/FriendLin/NetRequestDemo (本地下載)
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)億速云的支持。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。