RxJava2优于AsyncTask

时间:2017-10-23 16:19:29

标签: android rx-java2

您好我正在阅读rxjava2,这基本上是针对异步操作的。我发现它有一个运算符概念,其中AsyncTask在android中没有。

rxjava2AsyncTask有什么不同?

2 个答案:

答案 0 :(得分:14)

RxJava不是“基本上用于异步操作”。这只是它的一个方面。

  1. RxJava允许您对数据进行组合操作,以便一个操作的输出可以用作下一个操作的输入。这与流实现类似。
  2. RxJava使用此可组合性允许在多线程环境中执行某些操作。它通过在使用多个调度程序时为操作员提供定义良好的语义来实现此目的。 RxJava可以使用asyncTask执行某些操作。
  3. RxJava使用Flowable链管理某些应用程序的背压要求,而Observable链没有背压要求。前者适用于需要缓冲的情况,或者需要明确确认丢弃的信息。
  4. RxJava具有明确的错误和错误处理语义。
  5. 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()));
}

希望这可以帮到你!!