使用 RxJava 处理代价高昂的操作

Using RxJava to handle costly operations

我对 RxJava 很陌生,所以我仍然很难使用它。 看了很多博文之类的,还是有点迷茫。

所以 - 我想获取所有已安装应用程序的列表。很简单。而不是 运行 它在异步任务中,我试图更花哨一点并使用 RxJava。

我的想法是做这样的事情:

    private void test(){
    Observable.from(getInstalledApps(true))
                .observeOn(Schedulers.newThread())
                .map(s -> s.appname)
                .subscribe(s -> L.d(TAG, "app: " + s));

}

但后来我意识到这行不通,因为 "observeOn" 仅适用于 .map,不适用于方法本身。

之后,我尝试向 Observable 提供一些空值,并在 .map 中启动方法 - 没有成功。

正确的做法是什么?

重写你的代码,可以这样重写:

 List apps = getInstalledApps(true)
 Observable.from()
            .observeOn(Schedulers.newThread())
            .map(s -> s.appname)
            .subscribe(s -> L.d(TAG, "app: " + s)); 

如您所见,getInstalledApp将在当前线程中被调用。您必须 "defert" 这个电话。为此,您可以构建自己的 Observable:

 Observable<List> myObs = Observable.create(subscriber -> {
         List result = getInstalledApp(true);
         subscriber.onNext(result);
         subscriber.onCompleted();
  }); 

然后您可以与您的 Observable 互动:

 myObs.subscribeOn(Schedulers.newThread()).subscribe();

像这样,您的 Observable 会将您的订阅代码调用到一个新线程中。