GankClient(JAVA)技術淺析(二)--Retrofit2+OkHttp3+RxJava2

Retrofit2+OkHttp3+RxJava2構建當前流行的網絡框架

導入

 dependencies {
    implementation "com.squareup.okhttp3:okhttp:3.9.1"
    implementation "com.squareup.okhttp3:logging-interceptor:3.9.1"
    implementation "com.squareup.retrofit2:retrofit:2.3.0"
    implementation "com.squareup.retrofit2:converter-gson:2.3.0"
    implementation "com.squareup.retrofit2:adapter-rxjava2:2.3.0"
    implementation "io.reactivex.rxjava2:rxandroid:2.1.7"
    implementation "io.reactivex.rxjava2:rxjava:2.0.1"
    }

OkHttp3

public OkHttpClient getNewClient() {
        //攔截器
        HttpLoggingInterceptor logging = new HttpLoggingInterceptor();
        logging.setLevel(HttpLoggingInterceptor.Level.BODY);
        OkHttpClient okHttpClient;
        if(DEBUG)
        {
            okHttpClient = new OkHttpClient.Builder()
                    .addInterceptor(logging)
                    .connectTimeout(TIMEOUT_CONNECTION, TimeUnit.SECONDS)
                    .writeTimeout(TIMEOUT_WRITE, TimeUnit.SECONDS)
                    .readTimeout(TIMEOUT_READ, TimeUnit.SECONDS)
                    .build();
        }else
        {
            okHttpClient = new OkHttpClient.Builder()
                    .connectTimeout(TIMEOUT_CONNECTION, TimeUnit.SECONDS)
                    .writeTimeout(TIMEOUT_WRITE, TimeUnit.SECONDS)
                    .readTimeout(TIMEOUT_READ, TimeUnit.SECONDS)
                    .build();
        }
        return okHttpClient;
    }

Retrofit2

  public Retrofit getRetrofit() {
        if (retrofit == null) {
            retrofit = new Retrofit.Builder()
                    .baseUrl(GankConstants.HOST)
                    .addConverterFactory(GsonConverterFactory.create())
                    .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                    .client(getNewClient())
                    .build();
        }
        return retrofit;
    }

RetrofitManager獲取Retrofit實例

public class RetrofitManager {

    public static  boolean DEBUG = true;
    private Retrofit retrofit;

    private static RetrofitManager mHttpUtil;

    private RetrofitManager() {
        retrofit = getRetrofit();
    }

    public static RetrofitManager getInstance() {
        if (mHttpUtil == null) {
            synchronized (RetrofitManager.class) {
                if (mHttpUtil == null) {
                    mHttpUtil = new RetrofitManager();
                }
            }
        }
        return mHttpUtil;
    }

    public Retrofit getRetrofit() {
         ```
        return retrofit;
    }

    private final int TIMEOUT_READ = 20;
    private final int TIMEOUT_CONNECTION = 20;
    private final int TIMEOUT_WRITE = 20;

    public OkHttpClient getNewClient() {
        ```
        return okHttpClient;
    }
}

GankServer(Retrofit 需要去 構建的API接口 )

  • 這裏只有@GET,常見還有@POST
  • Observable 爲RxJava 的被觀察者 相對於Retrofit將OkHttp的Callback轉化爲Observable
public interface GankServer {

    String ANDROID="data/Android/";

    @GET(ANDROID+"{page_rows}/{page}")
    Observable<GankBean> getAndriod(
            @Path("page_rows") int page_rows ,
                                    @Path("page") int page);
   ```
}

RetrofitHelper

  • 統一管理所有API server
public class RetrofitHelper {


    private GankServer mGankServer;

    public RetrofitHelper() {
        mGankServer = RetrofitManager.getInstance().getRetrofit().create(GankServer.class);
    }

    private static RetrofitHelper mAPIClient;


    public static RetrofitHelper getInstance() {
        if (mAPIClient == null) {
            mAPIClient = new RetrofitHelper();
        }
        return mAPIClient;
    }

    public GankServer getGankServer() {
        return mGankServer;
    }
}

在AndroidModel調用GankServer的getAndroid()

  • 調用返回Observable
  • 如果在這裏加入請求隊列,需要提供返回結果的接口給AndroidPresenter
public class AndroidModel implements AndroidContract.Model{

    private GankServer gankServer;

    @Override
    public Observable<GankBean> getAndroid(int page_rows,int page){
        GankServer gankServer =  RetrofitHelper.getInstance().getGankServer();
        Observable<GankBean> andriod = gankServer.getAndriod(page_rows, page);
        return andriod;
    }

}

在AndroidModel調用Observable 請求數據

  • (耦合了,更換請求框架麻煩)
  • 應該再增加一層接口,更換請求方式(如改爲OkHttp,不使用retrofit),只需修改model層即可
public class AndroidPresenter implements AndroidContract.Presenter{
     /**
     * 刷新列表
     */
    @Override
    public void refreshList() {
        Observable<GankBean> android = mModel.getAndroid(mPage_rows, 1);//被觀察者
        android.subscribeOn(Schedulers.io())//請求發佈在IO線程
                .observeOn(AndroidSchedulers.mainThread())//觀察結果在主線程處理
                .subscribe(new Observer<GankBean>() {//觀察者
                    Disposable mDisposable;
                    @Override
                    public void onSubscribe(Disposable d) {//發佈中...
                        mDisposableList.add(d) ;
                        mDisposable=d;//設置爲false可以切斷上下流,阻斷觀察處理
                    }

                    @Override
                    public void onNext(GankBean gankBean) {//正確處理,與onError互斥
                        if(mView!=null&&!gankBean.error)
                        {
                            mView.refreshListByData(gankBean.results);
                        }
                    }

                    @Override
                    public void onError(Throwable e) {//錯誤處理,與onNext互斥
                        if(mView!=null )
                        {
                            mView.showErrorView();
                        }
                    }

                    @Override
                    public void onComplete() {//完成處理在onNext或onError之後
                        mDisposableList.remove(mDisposable);
                    }
                });
    }
}

複用

新增APIServer

  • 新增APIServer及獲取數據方法
  • 在RetrofitHelper新增getAPIServer()
  • 在Model調用RetrofitHelper的getAPIServer()的獲取數據方法獲取Observable
  • 在Presenter使用Model的Observable請求數據並處理

在現有APIServer新增獲取數據方法

  • 在現有APIServer新增獲取數據方法
  • 在Model調用RetrofitHelper的getAPIServer()的獲取數據方法獲取Observable
  • 在Presenter使用Model的Observable請求數據並處理(耦合了,更換請求框架麻煩)

github

GankClient源碼地址:

https://github.com/LinweiJ/GankClient

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章