【发布时间】:2017-01-19 22:14:32
【问题描述】:
在更改“SortBy”时,我的程序将执行 NetworkIO 来检索热门电影并显示它们。
然而,似乎虽然我已经完成了subscribeOn(Schedulers.io()),但map 中的函数call 中的NetworkIO MovieDB.getPopular() 和MovieDB.getTopRated() 在主线程上执行,我得到了一个android.os.NetworkOnMainThreadException。
我想知道如何使 public Movie[] call(SortBy sortBy) 异步。
sortObservable.map(new Func1<SortBy, Movie[]>() {
@Override
public Movie[] call(SortBy sortBy) {
try {
switch (sortBy) {
case POPULAR:
return MovieDB.getPopular(); // NETWORK IO
case TOP_RATED:
return MovieDB.getTopRated(); // NETWORK IO
}
} catch (IOException e) {
e.printStackTrace();
} catch (JSONException e) {
e.printStackTrace();
}
return new Movie[0];
}
})
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Action1<Movie[]>() {
@Override
public void call(Movie[] movies) {
imageAdapter.loadData(movies);
}
});
【问题讨论】:
-
您可以改用
flatMap,并将您的 io 调用包装在一个 observable 中。 -
subscribeOn是调用subscribe的位置。使用observeOn控制上一个observable的线程。 -
@njzk2 我还是得到了
android.os.NetworkOnMainThreadException,源代码在这里:github.com/zizhengwu/Popular-Movies-Stage-1/blob/load-image/app/… -
@kmx 不,这不是您将其包装在可观察对象中的方式。这不会改变 io 调用是在调用 flatmap 方法的同一线程中进行的事实。请改用可调用对象和
fromCallable,这样您就可以在订阅时给它一个线程来使用 -
嗨@njzk2,我仍然不知道如何将
callable和fromCallable与我的地图功能联系起来。你能给我一些代码吗?
标签: java android rx-java rx-android