(10)RxJava2+Retrofit2+OkHttp3系列(综合案例)

前面9篇博客我们已经分析过RxJava2,Retrofit2,OkHttp3的基本使用,这里提供一下9篇博客的地址。

  1. RxJava2+Retrofit2+OkHttp3系列(RxJava2-1)
  2. RxJava2+Retrofit2+OkHttp3系列(RxJava2-2)
  3. RxJava2+Retrofit2+OkHttp3系列(RxJava2-3)
  4. RxJava2+Retrofit2+OkHttp3系列(RxJava2-4)
  5. RxJava2+Retrofit2+OkHttp3系列(RxJava2-5)
  6. RxJava2+Retrofit2+OkHttp3系列(RxJava2-6)
  7. RxJava2+Retrofit2+OkHttp3系列(RxJava2-7)
  8. RxJava2+Retrofit2+OkHttp3系列(Retrofit2-1)
  9. RxJava2+Retrofit2+OkHttp3系列(OkHttp3-1)

##正题

说明:由于项目中有其他代码,所以我就不上传代码了,这里将所以代码贴上外加注释,希望帮助大家理解。

###gradle配置

compile 'io.reactivex.rxjava2:rxjava:2.0.7'
compile 'io.reactivex.rxjava2:rxandroid:2.0.1'

compile 'com.squareup.retrofit2:retrofit:2.1.0'
//这个库可以支持到rxjava2.X
compile 'com.jakewharton.retrofit:retrofit2-rxjava2-adapter:1.0.0'
//Retrofit现在只支持到rxjava1.XX
//compile 'com.squareup.retrofit2:adapter-rxjava:2.1.0'

compile 'com.squareup.retrofit2:converter-gson:2.1.0'

compile 'com.squareup.okhttp3:okhttp:3.4.1'
compile 'com.squareup.okio:okio:1.7.0'

###(2)MainActivity

//处理返回结果的Handler
private Handler mHandler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);

            switch (msg.what) {
                case 1:
                    if (msg.obj instanceof ResultBean) {
                        ResultBean bean = (ResultBean) msg.obj;
                        Toast.makeText(MainActivity.this, bean.toString(), Toast.LENGTH_LONG).show();
                    }
                    break;
            }
        }
    };

//get请求
public void csdnGetBtn(View view) {
        Map<String, Integer> map = new HashMap<>();
        map.put("pno", 1);
        map.put("ps", 10);
        //callBack是处理结果的回调
        ObserverCallBack callBack = new ObserverCallBack<ResultBean>(this, mHandler);
        RxJava2Utils.getData(map, callBack);
    }

//post请求
public void csdnPostBtn(View view) {
        PostParamsBean bean = new PostParamsBean();
        bean.pno = 1;
        bean.ps = 10;

        ObserverCallBack callBack = new ObserverCallBack<ResultBean>(this, mHandler);
        RxJava2Utils.postData(bean, callBack);
    }

###(3)RxJava2Utils

public class RxJava2Utils {

	//获得Retrofit2Service对象
    private static final Retrofit2Service service = Retrofit2Utils.getRetrofit().create(Retrofit2Service.class);

    //get请求
    public static void getData(Map<String, Integer> map, Observer<ResultBean> observer) {
	    //使用RxJava切换线程处理返回结果
        setSubscribe2(service.getWxData(map), observer);
    }

    //post请求
    public static void postData(PostParamsBean bean, Observer<ResultBean> observer) {
        setSubscribe2(service.postWxData(bean), observer);
    }

    //Rxjava2.0
    public static <T> void setSubscribe2(Observable<T> observable, Observer<T> observer) {
        observable.subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(observer);
    }
}

###(4)Retrofit2Utils

public class Retrofit2Utils {

    //服务器路径
    private static final String API_SERVER = "http://v.juhe.cn";

    private static OkHttpClient mOkHttpClient;
    private static Retrofit mRetrofit;

    /**
     * 获取Retrofit对象
     */
    public static Retrofit getRetrofit() {

        if (mRetrofit == null) {

            if (mOkHttpClient == null) {
                mOkHttpClient = OkHttp3Utils.getOkHttpClient();
            }

            mRetrofit = new Retrofit.Builder()
                    .baseUrl(API_SERVER)
                    //添加转化库,默认是Gson
                    .addConverterFactory(GsonConverterFactory.create())
                    //添加回调库,采用RxJava
                    .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                    //原生RxJava2.0不支持
                    //.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
                    .client(mOkHttpClient)
                    .build();
        }
        return mRetrofit;
    }
}

###(5)Retrofit2Service

public interface Retrofit2Service {

    //http://v.juhe.cn/weixin/query?key=您申请的KEY

    @GET("/weixin/query")
    Observable<ResultBean> getWxData(@QueryMap Map<String, Integer> map);

    @POST("/weixin/query")
    Observable<ResultBean> postWxData(@Body PostParamsBean bean);
}

###(6)OkHttp3Utils

public class OkHttp3Utils {

    //设置缓存目录
    private static File cacheDirectory = new File(MyApplication.getInstance().getApplicationContext().getCacheDir().getAbsolutePath(), "MyCache");
    private static Cache cache = new Cache(cacheDirectory, 10 * 1024 * 1024);

    private static OkHttpClient mOkHttpClient;

    /**
     * 获取OkHttpClient对象
     */

    public static OkHttpClient getOkHttpClient() {
        if (mOkHttpClient == null) {
            mOkHttpClient = new OkHttpClient.Builder()
                    .connectTimeout(10, TimeUnit.SECONDS)
                    .readTimeout(10, TimeUnit.SECONDS)
                    .writeTimeout(10, TimeUnit.SECONDS)
                    .cache(cache)
                    .addInterceptor(new MyIntercepter())
                    //.cookieJar(new CookiesManager())
                    .build();
        }
        return mOkHttpClient;
    }

    //自定义拦截器
    private static class MyIntercepter implements Interceptor {

        @Override
        public Response intercept(Chain chain) throws IOException {

            Request oldRequest = chain.request();
            HttpUrl.Builder builder = oldRequest.url()
                    .newBuilder()
                    .scheme(oldRequest.url().scheme())
                    .host(oldRequest.url().host())
                    //公共参数
                    .addQueryParameter("key", "c2ada070f003865ea7bb07ae8c2498b7");

            Request newRequest = oldRequest.newBuilder()
                    .method(oldRequest.method(), oldRequest.body())
                    //.header("Content-Type", "application/json")
                    .url(builder.build())
                    .build();

            Response response = chain.proceed(newRequest);

            return response;
        }
    }

    //Cookie设置
    static HashMap<String, List<Cookie>> cookieStore = new HashMap<>();

    private static class CookiesManager implements CookieJar {

        @Override
        public void saveFromResponse(HttpUrl url, List<Cookie> cookies) {
            cookieStore.put(url.host(), cookies);
        }

        @Override
        public List<Cookie> loadForRequest(HttpUrl url) {
            List<Cookie> cookies = cookieStore.get(url.host());
            return cookies != null ? cookies : new ArrayList<Cookie>();
        }
    }
}

最后我们在看一下处理结果的回调

###(7)ObserverCallBack

public class ObserverCallBack<T> implements Observer<T> {

    private Disposable disposable;
    private Context mContext;
    private Handler mHandler;

    public ObserverCallBack(Context context, Handler handler) {
        this.mContext = context;
        this.mHandler = handler;
    }

    @Override
    public void onSubscribe(Disposable d) {
        disposable = d;
    }

    @Override
    public void onNext(T t) {
        Message msg = Message.obtain();
        msg.obj = t;
        msg.what = 1;
        mHandler.sendMessage(msg);
    }

    @Override
    public void onError(Throwable e) {

    }

    @Override
    public void onComplete() {

    }

    public Disposable getDisposable() {
        return disposable;
    }
}

###(8)请求和处理结果的封装类

//请求封装类
public class PostParamsBean {

    //public int key;
    public int pno;
    public int ps;

}

//处理返回结果封装类
public class ResultBean {

    public String reason;
    public String error_code;
    public Result result;

    public static class Result {
        public int totalPage;
        public int ps;
        public int pno;

        public List<ResultList> list;
    }

    public static class ResultList {
        public String id;
        public String title;
        public String source;
        public String firstImg;
        public String mark;
        public String url;
    }

    @Override
    public String toString() {
        return "ResultBean{" +
                "reason='" + reason + '\'' +
                ", error_code='" + error_code + '\'' +
                ", result=" + result +
                '}';
    }
}

好啦,到此整个整个案例的代码就展示完全了,整个逻辑是:
请求–>RxJava–>Retrofit–>OkHttp–>CallBack处理

使用RxJava2 + Retrofit2 + OKHttp进行POST请求,可以按照以下步骤进行: 1. 添加依赖 在项目的build.gradle文件中添加以下依赖: ``` dependencies { implementation 'io.reactivex.rxjava2:rxjava:2.2.19' implementation 'io.reactivex.rxjava2:rxandroid:2.1.1' implementation 'com.squareup.retrofit2:retrofit:2.9.0' implementation 'com.squareup.retrofit2:converter-gson:2.9.0' implementation 'com.squareup.okhttp3:okhttp:4.9.1' } ``` 2. 创建Service接口 创建一个接口,用于定义POST请求的方法。例如: ``` public interface ApiService { @POST("login") Observable<LoginResponse> login(@Body LoginRequest request); } ``` 3. 创建Retrofit对象 在Application类或其他初始化类中,创建Retrofit对象: ``` public class MyApp extends Application { private static ApiService apiService; @Override public void onCreate() { super.onCreate(); // 创建OkHttpClient对象 OkHttpClient client = new OkHttpClient.Builder() .connectTimeout(10, TimeUnit.SECONDS) .readTimeout(10, TimeUnit.SECONDS) .writeTimeout(10, TimeUnit.SECONDS) .build(); // 创建Retrofit对象 Retrofit retrofit = new Retrofit.Builder() .baseUrl("http://example.com/api/") .client(client) .addConverterFactory(GsonConverterFactory.create()) .addCallAdapterFactory(RxJava2CallAdapterFactory.create()) .build(); apiService = retrofit.create(ApiService.class); } public static ApiService getApiService() { return apiService; } } ``` 4. 发起POST请求 在需要发起POST请求的地方,可以使用以下代码: ``` LoginRequest request = new LoginRequest(); request.setUsername("admin"); request.setPassword("123456"); MyApp.getApiService().login(request) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Observer<LoginResponse>() { @Override public void onSubscribe(Disposable d) { } @Override public void onNext(LoginResponse response) { // 处理响应数据 } @Override public void onError(Throwable e) { // 处理异常 } @Override public void onComplete() { } }); ``` 上述代码中,我们首先创建了一个LoginRequest对象,用于存储要发送的数据。然后调用MyApp.getApiService().login(request)方法,发起POST请求。在这里,我们使用了RxJava2的Observable对象,将请求结果封装为一个可观察对象。使用subscribeOn(Schedulers.io())指定在IO线程中进行网络请求,使用observeOn(AndroidSchedulers.mainThread())指定在主线程中处理响应。最后通过subscribe方法订阅请求结果,处理响应数据或异常。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

雪舞飞影

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值