Retrofit+RxJava 簡單介紹

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();
        }
    }

結束。

相關文章
相關標籤/搜索