使用 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 会将您的订阅代码调用到一个新线程中。
我对 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 会将您的订阅代码调用到一个新线程中。