Android 快速使用RxJava + OkHttp 進行網絡請求

android開發中,偶爾會遇到需要 將一個網絡請求單獨寫 的需求
因爲大框架不會因爲一絲絲小改動,而去改變

下面簡單介紹一下用OKHttp+RxJava,進行網絡請求
並且回調更新UI

下面上一段代碼:

  protected void srvGetData(String idCard, String startTime, String endTime) {
        mDialog.show();
        HashMap<String, String> params = HttpClienrFactory.newGeneralParams();
        params.put("startTime", startTime);
        params.put("endTime", endTime);
        params.put("idCard", idCard);

        String sign = null;
        try {
            sign = SignUtils.generateSign(params);
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        params.put("sign", sign);


        Observable.just(params)
                .map(new Function<HashMap<String, String>, PovertyBean>() {

                    @Override
                    public PovertyBean apply(HashMap<String, String> params) throws Exception {
                        OkHttpClient okHttpClient = new OkHttpClient.Builder()
                                .readTimeout(45, TimeUnit.SECONDS)//設置讀取超時時間
                                .writeTimeout(45, TimeUnit.SECONDS)//設置寫的超時時間
                                .connectTimeout(45, TimeUnit.SECONDS)//設置連接超時時間
                                .build();
                        FormBody.Builder builder = new FormBody.Builder();
                        for (HashMap.Entry<String, String> map : params.entrySet()) {
                            builder.add(map.getKey(), map.getValue());
                        }
                        FormBody body = builder.build();
                        Request.Builder reqBuilder = new Request.Builder();
                        for (HashMap.Entry<String, String> map : HttpClienrFactory.newGeneralHeader().entrySet()) {
                            reqBuilder.header(map.getKey(), map.getValue());
                        }
                        Request request = reqBuilder
                                .url(UrlConstants.SERVE_GET_REDEEM_GATHER)
                                .post(body)
                                .build();
                        Logger.i(TAG, "request = " + request.url());
                        Call call = okHttpClient.newCall(request);
                        Response response = call.execute();
                        String json = response.body().string();

                        PovertyBean povertyBean = new Gson().fromJson(json, PovertyBean.class);
                        return povertyBean;
                    }
                })
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .doOnError(new Consumer<Throwable>() {
                    @Override
                    public void accept(Throwable throwable) throws Exception {
                        mDialog.dismiss();
                        Toast.makeText(getApplicationContext(), throwable.getMessage(), Toast.LENGTH_SHORT).show();
                    }
                })
                .subscribe(new Consumer<PovertyBean>() {
                    @Override
                    public void accept(PovertyBean povertyBean) throws Exception {
                        mDialog.dismiss();
                        if (povertyBean == null
                                || povertyBean.data == null
                                || povertyBean.data.redeemGatherResultEntity == null) {
                            return;
                        }

                        updatePovertyUI(povertyBean.data.redeemGatherResultEntity);
                    }
                });


    }

subscribeOn: 指定 map 一類的操作在哪個線程
observeOn: 指定 subscribe 回調在哪個線程

.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())

doOnError(): 當數據處理的過程中(map一類的操作), 發現異常.將統一走到 doOnError() 方法中.
可以在這個doOnError()方法內處理錯誤消息

非常簡單的用法!

發佈了47 篇原創文章 · 獲贊 12 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章