使用RxJava处理昂贵的操作

时间:2015-03-04 15:21:09

标签: android reactive-programming rx-java

我对RxJava很新,所以我仍然很难使用它。 我阅读了很多博客文章等等,而且我还有点失落。

所以 - 我想获得所有已安装应用的列表。很简单。而不是在asynchtask中运行它我试图更加花哨并使用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内启动方法 - 没有运气。

这样做的正确方法是什么?

1 个答案:

答案 0 :(得分:2)

记住你的代码,它可以像这样重写:

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

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

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

然后您可以与Observable

进行互动
 myObs.subscribeOn(Schedulers.newThread()).subscribe();
像这样,您的Observable会将您的订阅代码调用到一个新线程中。