Об изменении «SortBy» моя программа сделает NetworkIO, чтобы получить лучшие фильмы и отобразить их.Android RxJava асинхронный вызов в функции карты
Тем не менее, кажется, что, хотя я сделал subscribeOn(Schedulers.io())
, в NetworkIO MovieDB.getPopular()
и MovieDB.getTopRated()
в функции call
в map
являются excuted в основном потоке, и я получаю 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 вызывает наблюдение. – njzk2
'subscribeOn', где вызывается' subscribe'. Используйте 'observOn' для управления потоком предыдущего наблюдаемого. – njzk2
@ njzk2 Я все еще получаю 'android.os.NetworkOnMainThreadException', исходный код здесь: https://github.com/zizhengwu/Popular-Movies-Stage-1/blob/load-image/app/src/main/java/ com/zizhengwu/popular_movies_stage_1/MainActivity.java # L75 – knx54693