в этом фрагменте кода я пытаюсь обработать кучу данных, но это не может быть в потоке пользовательского интерфейса, в противном случае возможен ANR. Я думал, что это легко сделать с помощью rxJava2, однако обработка данных всегда выполняется в основном потоке.
Загрузка данных запускается в «докладчике» следующим образом:
void loadHistoricalDataFromFile(String filename){
view.showProgressDialog();
addDisposable(
model.loadHistoricalDataObservable(filename)
.subscribeOn(rxSchedulers.runOnBackground())
.observeOn(rxSchedulers.mainThread())
.subscribe(loadedSuccessfully -> {
view.hideProgressDialog();
if (loadedSuccessfully){
view.showSnackBar(R.string.simulator_loaded_data_success, LENGTH_SHORT);
} else {
view.showSnackBar(R.string.simulator_loaded_data_fail, LENGTH_INDEFINITE);
}
}));
}
Как видите, я использовал .subscribeOn(rxSchedulers.runOnBackground())
rxSchedulers.runOnBackground()
реализован следующим образом:
public class AppRxSchedulers implements RxSchedulers {
public static Executor backgroundExecutor = Executors.newCachedThreadPool();
public static Scheduler BACKGROUND_SCHEDULERS = Schedulers.from(backgroundExecutor);
public static Executor internetExecutor = Executors.newCachedThreadPool();
public static Scheduler INTERNET_SCHEDULERS = Schedulers.from(internetExecutor);
public static Executor singleExecutor = Executors.newSingleThreadExecutor();
public static Scheduler SINGLE_SCHEDULERS = Schedulers.from(singleExecutor);
@Override
public Scheduler runOnBackground() {
return BACKGROUND_SCHEDULERS;
}
@Override
public Scheduler io() {
return Schedulers.io();
}
@Override
public Scheduler compute() {
return Schedulers.computation();
}
@Override
public Scheduler mainThread() {
return AndroidSchedulers.mainThread();
}
@Override
public Scheduler internet() {
return INTERNET_SCHEDULERS;
}
@Override
public Scheduler single() {
return SINGLE_SCHEDULERS;
}
}
Single.Just () реализован следующим образом
Single<Boolean> loadHistoricalDataObservable(String filename){
return Single.just(loadHistoricalData(filename));
}
private Boolean loadHistoricalData(String filename){
boolean successful = false;
String json = FileUtils.readFileAsStringFromExtRam(filename);
if (json.length() > 0) {
Gson gson = new Gson();
historicPriceList = null;
historicPriceList = gson.fromJson(json, new TypeToken<List<HistoricPrice>>(){}.getType());
successful = true;
Timber.d("Successfully loaded file - recreated %d records", historicPriceList.size());
} else {
Timber.d("Failed to load file");
}
return successful;
}
Основная проблема заключается в том, что всякий раз, когда я достигаю точки останова в loadHistoricalData()
, я вижу, что она запускается в основном потоке. Это обязательно должно быть в другом потоке. Как это возможно?