RxJava 结合 OkHttp 访问网络

RxJava 结合 OkHttp 访问网络

这里以访问 Github api 为例。

创建 Observable

首先使用 create 方法创建 Observable,在回调方法中使用 OkHttp 异步请求网络,然后将返回结果发送给 emitter 的 onNext 方法。同时实现 emitter 的 onError 和 onComplete。

private Observable<String> getObservable() {
        return Observable.create(emitter -> {
            OkHttpClient okHttpClient = new OkHttpClient();
            Request request = new Request.Builder()
                    .url("https://api.github.com/users/flutter")
                    .get()
                    .build();
            Call call = okHttpClient.newCall(request);
            call.enqueue(new Callback() {
                @Override
                public void onFailure(@NotNull Call call, @NotNull IOException e) {
                    emitter.onError(e);
                }

                @Override
                public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException {
                    String str = response.body().string();
                    Log.d(TAG, "onResponse:" + response + ", body:" + str);
                    emitter.onNext(str);
                    emitter.onComplete();
                }
            });
        });
    }

订阅观察者 Observer

观察者订阅代码如下:

    private void getAsyncHttp() {
        Observable<String> observable = getObservable();
        observable.subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(str -> Toast.makeText(getApplicationContext(), "load success:" + str, Toast.LENGTH_LONG).show(),
                        throwable -> Log.e(TAG, "onError:" + throwable.getMessage()), () -> Log.d(TAG, "onCompleted"));
    }

观察者收到 onNext 消息后发送 Toast。因为使用了 observeOn 方法运行在 Android 主线程,所以可以做 UI 操作。

输出结果如下:

RxJavaActivity: onResponse:Response{protocol=http/1.1, code=200, message=OK, url=https://api.github.com/users/flutter}, body:{"login":"flutter","id":14101776, ...

添加网络权限

网络请求需要在 AndroidManifest 添加网络权限

    

如果是 P 版本以上的非 Https 请求,需要在 application 节点配置允许明文。

        android:networkSecurityConfig="@xml/network_security_config"

res/xml 目录的 network_security_config.xml



    

你可能感兴趣的:(Android,开源框架)