RxJava2 相对于 AsyncTask 的优势
Advantage of RxJava2 over AsyncTask
您好,我正在阅读有关 rxjava2
的内容,它主要用于异步操作。我发现它有一个运算符概念,AsyncTask
in android 没有。
rxjava2
与 AsyncTask
有何不同?
RxJava 不是 "basically for async operation"。这只是一方面。
- RxJava 允许您组合对数据的操作,这样一个操作的输出可以用作下一个操作的输入。这与流实现类似。
- RxJava 使用这种可组合性允许一些操作在多线程环境中发生。它通过在使用多个调度程序时为运算符提供定义明确的语义来实现这一点。 RxJava 可以使用
asyncTask
来执行一些操作。
- RxJava 通过使用
Flowable
链来管理某些应用程序的背压要求,而 Observable
链没有背压要求。前者适用于需要缓冲或需要明确确认丢弃信息的情况。
- RxJava 具有清晰的错误和错误处理语义。
asyncTask
只处理异步任务。
AsyncTask
是 Android 的默认工具,开发人员需要在 UI 屏幕的上下文中做一些简单的长篇 运行 工作而不阻塞UI.
AsyncTask 的主要问题是:
多个 Web 服务调用:
为了在 AsyncTask
中解决这个问题,在我们的 Activity/Fragment 中创建一个内部 AsyncTask subclass,在后台执行网络操作,并获取该操作的结果并更新UI 在主线程中。
此方法存在一些问题和局限性:
Memory/context 泄漏 很容易创建是一个内部 class 并且因此持有对外部 class 的隐式引用 另外,如果我们想在网络调用之后链上另一个长操作吗?我们必须嵌套两个 AsyncTask,这会显着降低可读性。
错误处理
如果出现问题怎么办?不幸的是,没有开箱即用的解决方案。
以及设备旋转,后按手柄等其他问题
要解决所有问题,请查看 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()));
}
希望对您有所帮助!!
您好,我正在阅读有关 rxjava2
的内容,它主要用于异步操作。我发现它有一个运算符概念,AsyncTask
in android 没有。
rxjava2
与 AsyncTask
有何不同?
RxJava 不是 "basically for async operation"。这只是一方面。
- RxJava 允许您组合对数据的操作,这样一个操作的输出可以用作下一个操作的输入。这与流实现类似。
- RxJava 使用这种可组合性允许一些操作在多线程环境中发生。它通过在使用多个调度程序时为运算符提供定义明确的语义来实现这一点。 RxJava 可以使用
asyncTask
来执行一些操作。 - RxJava 通过使用
Flowable
链来管理某些应用程序的背压要求,而Observable
链没有背压要求。前者适用于需要缓冲或需要明确确认丢弃信息的情况。 - RxJava 具有清晰的错误和错误处理语义。
asyncTask
只处理异步任务。
AsyncTask
是 Android 的默认工具,开发人员需要在 UI 屏幕的上下文中做一些简单的长篇 运行 工作而不阻塞UI.
AsyncTask 的主要问题是:
多个 Web 服务调用:
为了在
AsyncTask
中解决这个问题,在我们的 Activity/Fragment 中创建一个内部 AsyncTask subclass,在后台执行网络操作,并获取该操作的结果并更新UI 在主线程中。此方法存在一些问题和局限性:
Memory/context 泄漏 很容易创建是一个内部 class 并且因此持有对外部 class 的隐式引用 另外,如果我们想在网络调用之后链上另一个长操作吗?我们必须嵌套两个 AsyncTask,这会显着降低可读性。
错误处理
如果出现问题怎么办?不幸的是,没有开箱即用的解决方案。 以及设备旋转,后按手柄等其他问题
要解决所有问题,请查看 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()));
}
希望对您有所帮助!!