您好我正在阅读rxjava2
,这基本上是针对异步操作的。我发现它有一个运算符概念,其中AsyncTask
在android中没有。
rxjava2
与AsyncTask
有什么不同?
答案 0 :(得分:14)
RxJava不是“基本上用于异步操作”。这只是它的一个方面。
asyncTask
执行某些操作。Flowable
链管理某些应用程序的背压要求,而Observable
链没有背压要求。前者适用于需要缓冲的情况,或者需要明确确认丢弃的信息。 asyncTask
只处理异步任务。
答案 1 :(得分:3)
AsyncTask
是Android的默认工具,适用于需要在UI屏幕上下文中执行一些简单的长时间运行工作而不会阻止UI的开发人员。
AsyncTask的主要问题是:
多个网络服务电话:
要在AsyncTask
中解决此问题,请在我们的Activity / Fragment中创建一个内部AsyncTask子类,在后台执行网络操作,并获取该操作的结果并更新主线程中的UI。
这种方法存在一些问题和局限性:
内存/上下文泄漏很容易创建一个内部类,因此保持对外部类的隐式引用另外,如果我们想在网络调用后链接另一个长操作怎么办?我们必须嵌套两个AsyncTasks,这会显着降低可读性。
错误处理
如果出现问题会怎样?不幸的是,没有开箱即用的解决方案。 还有其他问题,如设备旋转,背压手柄等。
要解决这个问题,请查看 RxJava
使用RxJava处理错误是这样的:
webService.doSomething(someData)
.observeOn(AndroidSchedulers.mainThread())
.subscribe(
result -> resultText.setText("It worked!"),
e -> handleError(e));
其次,在多个Web服务调用中。
public Observable<List<Weather>> getWeatherForLargeUsCapitals() {
return cityDirectory.getUsCapitals()
.flatMap(cityList -> Observable.from(cityList))
.filter(city -> city.getPopulation() > 500,000)
.flatMap(city -> weatherService.getCurrentWeather(city)) //each runs in parallel
.toSortedList((cw1,cw2) -> cw1.getCityName().compare(cw2.getCityName()));
}
希望这可以帮到你!!