Retrofit 是一個當前很流行的網絡請求庫html
想使用它首先在gradle文件中引用java
compile 'com.squareup.retrofit2:retrofit:2.1.0' compile 'com.squareup.retrofit2:adapter-rxjava:2.1.0' compile ‘com.squareup.retrofit2:converter-gson:2.0.2’
RxJava 是針對於Java語音的一個異步響應式編程庫react
compile 'io.reactivex.rxjava2:rxjava:2.0.1'
compile ‘io.reactivex.rxjava2:rxandroid:2.0.1’
Retrofit的使用android
建立一個Retrofit對象web
private static void initRetrofit() { sRetrofit = new Retrofit.Builder() .baseUrl("http://www.weather.com.cn/") .client(sOkHttpClient) .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) .addConverterFactory(GsonConverterFactory.create()) .build(); }
client 設置OkHttp用於攔截器設置編程
addCallAdapterFactory()設置支持RxJava返回值爲Oservable<M>json
addConverterFactory() 設置支持Gson 直接返回實體類緩存
接下來在建立一個OKHttpClient.Buildr對象服務器
OkHttpClient.Builder builder = new OkHttpClient.Builder();
1設置結果攔截器網絡
Interceptor cacheInterceptor = new Interceptor() { @Override public Response intercept(Chain chain) throws IOException { Request request = chain.request(); if (!CommonUtil.isNetworkConnected(MyApplication.getInstance())) { request = request.newBuilder() .cacheControl(CacheControl.FORCE_CACHE) .build(); } Response response = chain.proceed(request); Response.Builder newBuilder = response.newBuilder(); if (CommonUtil.isNetworkConnected(MyApplication.getInstance())) { int maxAge = 0; // 有網絡時 設置緩存超時時間0個小時 newBuilder.header("Cache-Control", "public, max-age=" + maxAge); } else { // 無網絡時,設置超時爲4周 int maxStale = 60 * 60 * 24 * 28; newBuilder.header("Cache-Control", "public, only-if-cached, max-stale=" + maxStale); } return newBuilder.build(); } };
在這裏有網絡取最新,沒網取緩存
builder.cache(cache).addInterceptor(cacheInterceptor);
添加到builder;
2.設置請求攔截器
Interceptor requestInterceptor = new Interceptor() { @Override public Response intercept(Chain chain) throws IOException { Request request = chain.request() .newBuilder() .addHeader("Accept", "application/vnd.yu.v4+json") .addHeader("Content-Type", "application/json") .addHeader("Range", "page:1,max:10") .addHeader("Authorization", "") .build();request.headers().toString()); return chain.proceed(request); } };
通常設置統一header 時使用
builder.addNetworkInterceptor(requestInterceptor);
設置超時重連
builder.connectTimeout(15, TimeUnit.SECONDS); builder.readTimeout(20, TimeUnit.SECONDS); builder.writeTimeout(20, TimeUnit.SECONDS); builder.retryOnConnectionFailure(true);
return builder.build();
OkHttp設置完成。
接下來去設置ApiCallBack
使用RxJava訂閱
ApiCallBack<M>是abstract要繼承Subscriber<M>
public abstract class ApiCallback<M> extends Subscriber<M> { public abstract void onSuccess(M model); public abstract void onFailure(String msg); public abstract void onFinish(); @Override public void onError(Throwable e) { e.printStackTrace(); if (e instanceof HttpException) { HttpException httpException = (HttpException) e; int code = httpException.code(); String msg = httpException.getMessage(); if (code == 504) { msg = "網絡不給力"; } if (code == 502 || code == 404) { msg = "服務器異常,請稍後再試"; } onFailure(msg); } else { onFailure(e.getMessage()); } onFinish(); } @Override public void onNext(M model) { onSuccess(model); } @Override public void onCompleted() { onFinish(); } }
接下來去寫ApiService
ApiService 是個接口
Retrofit提供的請求方式用註解修改變量生成URL等
RxJava方式
@GET("adat/sk/{cityId}.html") Observable<MainModel> getMainBanner(@Path("cityId") String cityId); //請求方式@GET,@POST ,@PUT @DELETE 等。 (@Path(「cityId") String cityId) //修改路徑中對應的變量{cityId} @POST Observable<MainModel> getTaskToken(@Url String url, @Body String body); @Headers({"Accept: application/json","Content-Type: application/json"}) @GET Observable<RecordsTask> getMainTask(@Url String url, @Header("Authorization") String token);
以上簡單寫了幾種大多數都包括了
須要的已經配置好了 下面去使用它
//RXjava註冊 public void addSubscription(Observable observable, Subscriber subscriber) { if (mCompositeSubscription == null) { mCompositeSubscription = new CompositeSubscription(); } mCompositeSubscription.add(observable .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(subscriber)); }
把上面內容寫在Base中
subscribeOn() : 指定
subscribe()所發生的線程,即Observable.OnSubscribe被激活時所處的線程。或者叫作事件產生的線程。
observeOn():指定用戶所運行的線程。或者叫作事件消費的線程。
使用 subscribeOn() 和 observeOn() 兩個方法來對線程進行控制了。
在Activity中調用
public void loadWeather(String city) { addSubscription(mApiService.getMainBanner(city), new ApiCallback<MainModel>() { @Override public void onSuccess(MainModel response) { mMvpView.onSuccess(response); } @Override public void onFailure(String msg) { mMvpView.onFail(msg, 1); } @Override public void onFinish() { } }); }
在結束時還須要取消RxJava的註冊以避免內存泄漏
public void onUnsubscribe() { if (mCompositeSubscription != null && mCompositeSubscription.hasSubscriptions()) { mCompositeSubscription.unsubscribe(); } }
結束。