在Android中合理的使用Rxjava封装同步和异步调用

本文介绍了如何在Android中利用Rxjava合理地封装同步和异步调用,特别是处理Backpressure的问题。通过使用Observable.fromCallable和RxUtils.observableToMain进行同步操作封装,以及对比Observable.create和Flowable.create在处理异步API时的差异,强调了Flowable对backpressure的支持。还探讨了不同BackpressureMode策略,如BUFFER、LATEST和DROP在不同场景下的应用选择。
摘要由CSDN通过智能技术生成
同步和异步的区别:
 一般我们在程序中看到一些耗时的操作的方法,如果它有返回值等待调用者接收的情况就属于同步调用此时当前线程会
 阻塞在这里等待结果的返回
 异步调用方法一般会调用方法是传入响应的监听器类listener通过接口回调的方式来通知调用者结果而当前线程是不
 会阻塞等待结果返回的

 当需要封装现有 API 为 Observable 的时候,可以从一下几点来考虑:
   如果为同步 API 则使用 Observable.fromCallable()
   如果为异步 API 则:
      避免使用 Observable.create()
      使用 Flowable.create() 并正确实现如下步骤
      在合适的地方调用 onNext(), onCompleted(), 和 onError()
      如果需要清理资源,则使用 setCancellation()
      选择正确的 BackPressure 背压策略
1.rxjava封装同步调用 比如使用rxjava来封装SharePreference的使用
 RxView.clicks(findViewById(R.id.btn_rxjava_wrap_sync))
                .compose(RxUtils.preventDuplicateClicks())
                .subscribe(new Consumer() {
                    @Override
                    public void accept(Object o) throws Exception {

                        rxWrapSyncForSharepreferences(sharedPreferences).subscribe(new Consumer<Boolean>() {
                            @Override
                            public void accept(Boolean aBoolean) throws Exception {
                                Toast.makeText(RxjavaWrapAsyncAndsyncActivity.this, aBoolean ? "成功" : "失败", Toast.LENGTH_SHORT).show();
                            }
                        }, new Consumer<Throwable>() {
                            @Override
                            public void accept(Throwable throwable) throws Exception {
                                throwable.printStackTrace();
                                Log.d(TAG, "accept: " + throwable.getMessage());
                            }
                        });
                    }
                });
 private Observable<Boolean> rxWrapSyncForSharepreferences(final SharedPreferences sharedPreferences) {
        return Observable.fromCallable(new Callable<Boolean>() {
            @Override
            public Boolean call() throws Exception {
                boolean result = sharedPreferences.edit().putInt("a", 1)
                        .putInt("b", 2)
                        .putString("c", "c")
                        .commit();

                Log.d(TAG, "call: thread : " + Thread.currentThread().getName());

                return result;
            }
        }).compose(RxUtils.<Boolean>observableToMain());
    }

以上的场景为当我们

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值