Retrofit+OkHttp+RxJava+RxAndroid详解(中)

Retrofit+OkHttp+RxJava+RxAndroid详解(上)

Retrofit+OkHttp+RxJava+RxAndroid详解(上)_jianning-wu的博客-CSDN博客

上节讲述了Retrofit&OkHttp&RxJava&RxAndroid的基础讲解,显然还有优化的地方,比如OkHttp的详细操作,比如Service的封装,比如线程切换 等等。

下面继续讲解

1.Retrofit管理类

package com.wjn.networkdemo.retrofit.rxjavarxandroid;

import android.text.TextUtils;

import java.util.concurrent.TimeUnit;

import okhttp3.OkHttpClient;
import retrofit2.Retrofit;
import retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory;

public class RetrofitManager {

    private static final int DEFAULT_TIME_OUT = 60;//超时时间 60s

    private Retrofit mRetrofit;
    private static RetrofitManager retrofitManager = null;

    /**
     * 构造方法
     */

    private RetrofitManager(String baseUrl) {
        if (TextUtils.isEmpty(baseUrl) || !(baseUrl.endsWith("/"))) {
            return;
        }

        //配置okHttp的参数
        OkHttpClient okHttpClient = new OkHttpClient.Builder()
                .connectTimeout(DEFAULT_TIME_OUT, TimeUnit.SECONDS)//连接时间
                .readTimeout(DEFAULT_TIME_OUT, TimeUnit.SECONDS)//读时间
                .writeTimeout(DEFAULT_TIME_OUT, TimeUnit.SECONDS)//写时间
                .retryOnConnectionFailure(true)//连接失败后是否重新连接
                .build();

        //获取Retrofit对象
        mRetrofit = new Retrofit.Builder()
                .baseUrl(baseUrl)//设置BaseUrl 必须以'/'结尾
                .client(okHttpClient)//设置使用OkHttp请求
                .addCallAdapterFactory(RxJava2CallAdapterFactory.create())//设置RxJava适配器
                .build();
    }

    /**
     * 获取此单例类对象的方法
     */
    public static RetrofitManager getInstance(String baseUrl) {
        if (null == retrofitManager) {//单例对象为空
            synchronized (RetrofitManager.class) {
                if (null == retrofitManager) {
                    retrofitManager = new RetrofitManager(baseUrl);
                }
            }
        }
        return retrofitManager;
    }

    /**
     * 获取对应的Service
     */

    public <T> T createService(Class<T> service) {
        if (null == service) return null;
        return mRetrofit.create(service);
    }

}

2.自定义Observable
package com.wjn.networkdemo.retrofit.rxjavarxandroid;

import io.reactivex.Observable;
import io.reactivex.Scheduler;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.schedulers.Schedulers;

/**
 * 自定义Observable 避免每个Model请求都创建被观察者
 */

public class CustomObservable {

    /**
     * 创建观察者统一方法
     *
     * @param observable       被观察者
     * @param observableThread 被观察者所在线程
     * @param observeThread    观察者所在线程
     */

    protected <T> Observable<T> createObservable(Observable<T> observable, ThreadType observableThread, ThreadType observeThread) {
        Scheduler observableScheduler = Schedulers.io();//被观察者 默认IO线程
        if (observableThread == ThreadType.THREAD_MAIN) {//被观察者设置了其他线程 修改线程
            observableScheduler = AndroidSchedulers.mainThread();
        }

        Scheduler observeSchedulers = AndroidSchedulers.mainThread();//观察者 默认UI线程
        if (observeThread == ThreadType.THREAD_NEW) {//观察者设置了其他线程 修改线程
            observeSchedulers = Schedulers.io();
        }

        return observable
                .subscribeOn(observableScheduler)
                .unsubscribeOn(observableScheduler)
                .observeOn(observeSchedulers);
    }

}

3.线程管理类

package com.wjn.networkdemo.retrofit.rxjavarxandroid;

/**
 * 线程类型
 */
public enum ThreadType {
    /**
     * 新线程
     */
    THREAD_NEW,
    /**
     * UI线程
     */
    THREAD_MAIN,
}

4.Get&Post Presenter

package com.wjn.networkdemo.retrofit.rxjavarxandroid;

public class GetPresenter {

    private GetCallBack mGetCallBack;
    private GetModel mGetModel;

    public GetPresenter(GetCallBack callBack) {
        mGetCallBack = callBack;
        mGetModel = new GetModel(this);
    }

    /**
     * Get请求
     */

    public void getServiceData(String url) {
        if (null != mGetModel) {
            mGetModel.getServiceData(url);
        }
    }

    /**
     * 刷新UI
     */

    public void updateServiceUI(FanYiBean bean) {
        if (null == mGetCallBack || null == bean) {
            return;
        }

        mGetCallBack.getResult(bean);
    }

    /**
     * 回调
     */

    public interface GetCallBack {
        void getResult(FanYiBean bean);
    }

}


 

package com.wjn.networkdemo.retrofit.rxjavarxandroid;

import java.util.HashMap;

public class PostPresenter {

    public PostCallBack mPostCallBack;
    public PostModel mPostModel;

    public PostPresenter(PostCallBack callBack) {
        mPostCallBack = callBack;
        mPostModel = new PostModel(this);
    }

    /**
     * Post请求
     */

    public void postServiceData(HashMap map, String url) {
        if (null != mPostModel) {
            mPostModel.postServiceData(map, url);
        }
    }

    /**
     * 刷新UI
     */

    public void updateServiceUI(FanYiBean bean) {
        if (null == mPostCallBack || null == bean) {
            return;
        }

        mPostCallBack.postResult(bean);
    }

    /**
     * 回调
     */

    public interface PostCallBack {
        void postResult(FanYiBean bean);
    }

}

5.Get&Post Model

package com.wjn.networkdemo.retrofit.rxjavarxandroid;

import android.text.TextUtils;
import android.util.Log;

import com.google.gson.Gson;
import com.google.gson.JsonSyntaxException;

import java.io.IOException;

import io.reactivex.Observer;
import io.reactivex.disposables.Disposable;
import okhttp3.ResponseBody;

public class GetModel extends CustomObservable {

    private GetPresenter mGetPresenter;

    public GetModel(GetPresenter presenter) {
        mGetPresenter = presenter;
    }

    /**
     * Get请求
     */

    public void getServiceData(String url) {
        GetService getService = RetrofitManager.getInstance(url).createService(GetService.class);
        if (null != getService) {
            createObservable(getService.getFanYiByGet(), ThreadType.THREAD_NEW, ThreadType.THREAD_MAIN)
                    .subscribe(new Observer<ResponseBody>() {
                        @Override
                        public void onSubscribe(Disposable d) {

                        }

                        @Override
                        public void onNext(ResponseBody value) {
                            if (null == value) return;

                            String result = null;
                            try {
                                result = value.string();
                            } catch (IOException e) {
                                e.printStackTrace();
                            }

                            jsonData(result);
                        }

                        @Override
                        public void onError(Throwable e) {
                            jsonData("");
                        }

                        @Override
                        public void onComplete() {

                        }
                    });
        }
    }

    /**
     * Json数据解析
     */

    private void jsonData(String result) {
        Log.d("GetModel", "result----:" + result);
        FanYiBean fanYiBean = null;
        if (!TextUtils.isEmpty(result)) {
            try {
                fanYiBean = new Gson().fromJson(result, FanYiBean.class);
            } catch (JsonSyntaxException e) {
                e.printStackTrace();
            }
        }

        //最终刷新UI
        if (null != mGetPresenter) {
            mGetPresenter.updateServiceUI(fanYiBean);
        }
    }

}

package com.wjn.networkdemo.retrofit.rxjavarxandroid;

import android.text.TextUtils;
import android.util.Log;

import com.google.gson.Gson;
import com.google.gson.JsonSyntaxException;

import java.io.IOException;
import java.util.HashMap;

import io.reactivex.Observer;
import io.reactivex.disposables.Disposable;
import okhttp3.ResponseBody;

public class PostModel extends CustomObservable {

    private PostPresenter mPostPresenter;

    public PostModel(PostPresenter postPresenter) {
        mPostPresenter = postPresenter;
    }

    /**
     * Post请求
     */

    public void postServiceData(HashMap map, String url) {
        PostService postService = RetrofitManager.getInstance(url).createService(PostService.class);
        if (null != postService) {
            createObservable(postService.getFanYiByPost(map), ThreadType.THREAD_NEW, ThreadType.THREAD_MAIN)
                    .subscribe(new Observer<ResponseBody>() {
                        @Override
                        public void onSubscribe(Disposable d) {

                        }

                        @Override
                        public void onNext(ResponseBody value) {
                            if (null == value) return;

                            String result = null;
                            try {
                                result = value.string();
                            } catch (IOException e) {
                                e.printStackTrace();
                            }

                            jsonData(result);
                        }

                        @Override
                        public void onError(Throwable e) {
                            jsonData("");
                        }

                        @Override
                        public void onComplete() {

                        }
                    });
        }
    }

    /**
     * Json数据解析
     */

    private void jsonData(String result) {
        Log.d("PostModel", "result----:" + result);
        FanYiBean fanYiBean = null;
        if (!TextUtils.isEmpty(result)) {
            try {
                fanYiBean = new Gson().fromJson(result, FanYiBean.class);
            } catch (JsonSyntaxException e) {
                e.printStackTrace();
            }
        }

        //最终刷新UI
        if (null != mPostPresenter) {
            mPostPresenter.updateServiceUI(fanYiBean);
        }
    }

}

6.测试类

package com.wjn.networkdemo.retrofit.rxjavarxandroid;

import android.os.Bundle;
import android.util.Log;
import android.view.View;

import androidx.appcompat.app.AppCompatActivity;

import com.wjn.networkdemo.R;

import java.util.HashMap;

public class RetrofitRxJavaRxAndroidActivity extends AppCompatActivity implements GetPresenter.GetCallBack, PostPresenter.PostCallBack {

    private String mBaseUrl = "http://fanyi.youdao.com/";
    private GetPresenter mGetPresenter;
    private PostPresenter mPostPresenter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_retrofit_rxjava_rxandroid);

        //Get请求
        mGetPresenter = new GetPresenter(this);
        findViewById(R.id.activity_retrofit_rxjava_rxandroid_textview1).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                getData();
            }
        });

        //Post请求
        mPostPresenter = new PostPresenter(this);
        findViewById(R.id.activity_retrofit_rxjava_rxandroid_textview2).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                HashMap<String, String> map = new HashMap<>();
                map.put("keyfrom", "imoocdict123456");
                map.put("key", "324273592");
                map.put("type", "data");
                map.put("doctype", "json");
                map.put("version", "1.1");
                map.put("q", "red");
                postData(map);
            }
        });

    }

    /**
     * Retrofit Get请求
     */

    private void getData() {
        if (null != mGetPresenter) {
            mGetPresenter.getServiceData(mBaseUrl);
        }
    }

    /**
     * Retrofit Post请求
     */

    private void postData(HashMap<String, String> map) {
        if (null != mPostPresenter) {
            mPostPresenter.postServiceData(map, mBaseUrl);
        }
    }

    /**
     * Get请求回调
     */

    @Override
    public void getResult(FanYiBean bean) {
        if (null == bean) return;
        String query = bean.query;
        String errorCode = bean.errorCode;
        Log.d("Retrofit", "111 Get请求回调 query----:" + query);
        Log.d("Retrofit", "111 Get请求回调 errorCode----:" + errorCode);
        Log.d("Retrofit", "111 Get请求回调 线程----:" + Thread.currentThread().getName());
    }

    /**
     * Post请求回调
     */

    @Override
    public void postResult(FanYiBean bean) {
        if (null == bean) return;
        String query = bean.query;
        String errorCode = bean.errorCode;
        Log.d("Retrofit", "222 Post请求回调 query----:" + query);
        Log.d("Retrofit", "222 Post请求回调 errorCode----:" + errorCode);
        Log.d("Retrofit", "222 Post请求回调 线程----:" + Thread.currentThread().getName());
    }
}

7.结果

D/Retrofit: 111 Get请求回调 query----:blue


D/Retrofit: 111 Get请求回调 errorCode----:0


D/Retrofit: 111 Get请求回调 线程----:main




D/Retrofit: 222 Post请求回调 query----:red


D/Retrofit: 222 Post请求回调 errorCode----:0


D/Retrofit: 222 Post请求回调 线程----:main

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值