Парсинг JSON в RxJava

196
19 декабря 2017, 18:09

Дело в том, что я раньше парсил локальный 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, блок, внутри которого можно решать тяжелые задачи?

Answer 1

Насколько мне известно, Observable.just() выполнится в том потоке, где вызывается. Т.е. на него subscribeOn() не подействует.

А вот если just заменить на fromCallable, то код внутри будет вызван в том потоке, коий в subscribeOn() указан.

Answer 2

Вместо

AndroidShedulers.mainThread

Попробуйте

new Thread() 

Или

Shedulers.newThread()

Если внутри вам нужно работать с UI то делайте так

new Handler(Looper.getMainLooper()).post(new Runnable() {
    @Override
    public void run() {
        //работайте с UI
    }
});
READ ALSO
Использование переменных в .properties

Использование переменных в .properties

Естьproperties файл в нем лежат пути:

209
Jax ws и jax rs это servlet?

Jax ws и jax rs это servlet?

Вот Spring MVC это простые сервлетыЯвляется ли реализации jax ws и jax rs основанными на servletax? к примеру те же Jersey и Metro

159
Избавиться от null с помощью Optional

Избавиться от null с помощью Optional

Есть вот такая конструкция

216
одна synchronizedMap между двумя классами

одна synchronizedMap между двумя классами

ПриветствуюСтолкнулся со следующей проблемой

170