Rxjava结合OkHttp访问网络

当然要访问网络别忘记在AndroidMainfest中配置权限


要使用OkHttp3.0和RxJava
配置gradle(app)

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

	 compile'io.reactivex:rxjava:1.2.0'
     compile'io.reactivex:rxandroid:1.2.1'

先看我的布局xml



    

在Activity中的关键方法代码
首先创建RxJava模式里面的Observable(被观察者)

private Observable getObservable(final String str) {
        Observable observable = Observable.create(new Observable.OnSubscribe() {
            @Override
            public void call(final Subscriber subscriber) {
                mOkhttpClient = new OkHttpClient();
                RequestBody formBody = new FormBody.Builder()
                        .add("accountId", str)
                        .build();
                Request request = new Request.Builder()
                        .url("http://api.yesapi.cn/?s=App.Hello.World")
                        .post(formBody)
                        .build();
                Call call = mOkhttpClient.newCall(request);
                call.enqueue(new Callback() {
                    @Override
                    public void onFailure(Call call, IOException e) {
                        subscriber.onError(new Exception("error"));
                    }

                    @Override
                    public void onResponse(Call call, Response response) throws IOException {
                        String string = response.body().string();
                        subscriber.onNext(string);          	// ** 1 **
                        subscriber.onCompleted();

                    }
                });

            }
        });
        return observable;
    }

首先在创建Observable的实例对象时在其create方法中传入Observable.OnSubscribe < String >的匿名对象,查看其代码源码

    /**
     * Invoked when Observable.subscribe is called.
     * @param  the output value type
     */
    public interface OnSubscribe extends Action1> {
        // cover for generics insanity
    }

可知这里的泛型是指发射值的类型,且这个匿名对象时Action1的子类,RxJava里面有很多Action,Action后面的数字是回调参数类型的数量这里讲解简单使用,回调参数为一个String类型的参数。
上面代码注释1处调用subscriber.onNext来将请求返回的数据加到事件队列中。
接下看实现 观察者 代码。

private void postAsyncHttp(String size) {
        getObservable(size).subscribeOn(Schedulers.io())
        .observeOn(AndroidSchedulers.mainThread()).subscribe(new Subscriber() {
            @Override
            public void onCompleted() {
                Log.d(TAG, "onCompleted: ");
            }

            @Override
            public void onError(Throwable e) {
                Log.d(TAG, e.getMessage());

            }

            @Override
            public void onNext(String s) {
                Log.d(TAG, s);
                textView.setText(s);   //         2
            }
        });
    }

首先看getObservable(size).subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Subscriber() {…} );
调用得到被观察者的方法。subscibeOn用于控制RxJava的线程控制,Schedulers.io():I/O操作(读写文件,读写数据库,网络信息交互等)所使用的Scheduler。observeOn(AndroidSchedulers.mainThread())用于将网络回调设置为主线程。AndroidSchedulers.mainThread()是RxAndroid库中提供的Scheduler。
subscribe()为订阅方法,其传入Subscriber泛型,跟Observable里面的泛型互通有联系。
代码注释2处onNext(String s)将网络连接访问而来获取的字符串来展示。
这是最终效果图
Rxjava结合OkHttp访问网络_第1张图片

你可能感兴趣的:(Android)