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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值