同步和异步的区别:
一般我们在程序中看到一些耗时的操作的方法,如果它有返回值等待调用者接收的情况就属于同步调用此时当前线程会
阻塞在这里等待结果的返回
异步调用方法一般会调用方法是传入响应的监听器类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());
}
以上的场景为当我们