Дело в том, что я раньше парсил локальный JSON
в AsyncTask
. Но я начал изучать RxJava
и пытаюсь распарсить огромный JSON
файл из assets
таким образом:
Observable.just(AssetsUtil.getCountryList(context))
.flatMapIterable(new Function<List<Country>, Iterable<?>>() {
@Override
public Iterable<?> apply(List<Country> countryList) throws Exception {
return countryList;
}
})
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(item -> mView.onCountryListReceive((Country) item));
где onCountryListReceive((Country) item))
:
@Override
public void onCountryListReceive(Country country) {
countries.add(country);
PreferencesUtil.putCountryList(getActivity(), countries);
}
AssetsUtil.getCountryList(context)
:
public static List<Country> getCountryList(Context context) {
String countryJson = loadJSONFromAsset(context);
List<Country> countryList = new Gson().fromJson(countryJson, new TypeToken<List<Country>>(){}.getType());
cityList = new ArrayList<>();
if (countryList != null) {
for (Country country : countryList){
cityList.addAll(country.getCities());
}
}
return countryList;
}
Я уверен, что делаю не правильно, так как, MainThread
зависает при парсинге.
Вопрос: Как реализовать задачи такого рода в RxJava
, может есть методы типа doInBackground
, блок, внутри которого можно решать тяжелые задачи?
Насколько мне известно, Observable.just()
выполнится в том потоке, где вызывается. Т.е. на него subscribeOn()
не подействует.
А вот если just
заменить на fromCallable
, то код внутри будет вызван в том потоке, коий в subscribeOn()
указан.
Вместо
AndroidShedulers.mainThread
Попробуйте
new Thread()
Или
Shedulers.newThread()
Если внутри вам нужно работать с UI то делайте так
new Handler(Looper.getMainLooper()).post(new Runnable() {
@Override
public void run() {
//работайте с UI
}
});
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Вот Spring MVC это простые сервлетыЯвляется ли реализации jax ws и jax rs основанными на servletax? к примеру те же Jersey и Metro