RxJava结合Retrofit实现的网络请求(Observable被观察者和 Subscriber观察者)


1.1、先导入依赖:    compile 'io.reactivex:rxjava:1.0.14'
                   compile 'io.reactivex:rxandroid:1.0.1'
1.2、简单理解:

  a.是一个异步操作,在子线程更改数据,在主线程做更新操作。

  b.被观察者是事件的产生方相当于子线程,观察者是消费者相当于主线程;
  他们是通过订略的方式进行连接。

  c.观察者 与 被观察者
观察者:Subscriber
    一般作用于 V层,负责接收 被观察者 传递过来的信息

被观察者:Observable 
    一般作用于 M层,负责发送 信息给 观察者

一、MainActivity的主方法

public class MainActivity extends AppCompatActivity {

    private TextView tv;

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

        tv = (TextView) findViewById(R.id.main_tv);
        /**
         * 初始化 观察者
         */
        Subscriber<String> subscriber = new Subscriber<String>() {

            /**
             * 完成回调方法
             */
            @Override
            public void onCompleted() {

            }

            /**
             * 错误回调方法
             * @param e
             */
            @Override
            public void onError(Throwable e) {

            }

            /**
             * 接收并处理回调方法
             * @param s
             */
            @Override
            public void onNext(String s) {
                tv.setText(s);
            }
        };

        OkHttps.getData(subscriber);

    }
}

二、被观察者的方法

/**
 * 网络请求类
 */
public class OkHttps {

    private static final String TAG="okhttps";

    /**
     * 网络请求网址
     */
    private static final String PATHS="http://api.expoon.com/AppNews/getNewsList/";

    public static void getData(final Subscriber subscriber){

        /**
         * 实例化 Retrofit对象
         * 构建者方法创建对象 链表式创建方法
         */
        /**
         * 添加 拦截器
         */
        OkHttpClient client = new OkHttpClient.Builder().addNetworkInterceptor(new iii()).build();

        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl(PATHS)
                .client(client)
                .addConverterFactory(GsonConverterFactory.create())
                .build();

        /**
         * 实例化 接口对象
         */
        DataService dataService = retrofit.create(DataService.class);

        /**
         * 调用 接口中的方法
         * 请求网络 并返回Call集合
         */
        Call<RsBean> data = dataService.getData();

        /**
         * 开始请求 将数据放入集合
         */
        data.enqueue(new Callback<RsBean>() {
            @Override
            public void onResponse(Call<RsBean> call, final Response<RsBean> response) {
                Log.i(TAG, "onResponse: "+response.body().toString());
                /**
                 * 创建 被观察者
                 * 其作用发送消息给观察者
                 */
                Observable<String> observable = Observable.create(new Observable.OnSubscribe<String>() {
                    @Override
                    public void call(Subscriber<? super String> subscriber) {
                        /**
                         * 发送消息给观察者
                         */
                        subscriber.onNext(response.body().toString());
                        subscriber.onCompleted();
                    }
                });

                /**
                 * 绑定 观察者 与 被观察者
                 */
                observable.subscribe(subscriber);
            }

            @Override
            public void onFailure(Call<RsBean> call, Throwable t) {

            }
        });

    }

    //设置插值器(拦截器)
    static class iii implements Interceptor {
        @Override
        public okhttp3.Response intercept(Chain chain) throws IOException {
            Request request = chain.request();
            Headers headers = request.headers();
            for (int i = 0; i < headers.size(); i++) {
                String name = headers.name(i);
                String value = headers.value(i);
                Log.i(TAG, "intercept: " + "name=" + name + "  " + value);

            }
            okhttp3.Response response = chain.proceed(request);
            return response;
        }


    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
首先,需要添加 RetrofitRxJava 的依赖库。在 `build.gradle` 中添加以下代码: ``` implementation 'com.squareup.retrofit2:retrofit:2.9.0' implementation 'com.squareup.retrofit2:converter-gson:2.9.0' implementation 'io.reactivex.rxjava2:rxjava:2.2.19' implementation 'io.reactivex.rxjava2:rxandroid:2.1.1' ``` 接下来,定义 Retrofit 接口: ```java public interface ApiService { @POST("path/to/post") @FormUrlEncoded Observable<ResponseBody> postRequest(@Field("param1") String param1, @Field("param2") String param2); } ``` 这里使用了 `Observable<ResponseBody>` 作为返回值,表示请求结果以响应体的形式返回。`@FormUrlEncoded` 注解表示请求参数以表单形式提交。 然后,创建 Retrofit 实例: ```java Retrofit retrofit = new Retrofit.Builder() .baseUrl("https://example.com/") .addConverterFactory(GsonConverterFactory.create()) .addCallAdapterFactory(RxJava2CallAdapterFactory.create()) .build(); ApiService apiService = retrofit.create(ApiService.class); ``` 在请求时,使用 RxJava 的 `Observable` 对象作为被观察者,通过 `subscribeOn()` 指定请求在哪个线程执行,通过 `observeOn()` 指定结果在哪个线程回调。 ```java Observable<ResponseBody> observable = apiService.postRequest("value1", "value2"); observable.subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Observer<ResponseBody>() { @Override public void onSubscribe(Disposable d) { } @Override public void onNext(ResponseBody responseBody) { // 请求成功,处理响应结果 } @Override public void onError(Throwable e) { // 请求失败,处理错误信息 } @Override public void onComplete() { } }); ``` 这里使用了 `Schedulers.io()` 来指定请求在 IO 线程执行,使用了 `AndroidSchedulers.mainThread()` 来指定结果在主线程回调。 最后,记得在代码中添加网络权限: ```xml <uses-permission android:name="android.permission.INTERNET" /> ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值