Я новичок в RxJava в Android и пытаюсь вызвать метод для запроса SQLite. При использовании того же потока результат запроса передается в представление. Но когда я пытаюсь использовать другой trhead, используя subscribeOn(), это не работает. Как это исправить?
public void fetchNaskah() {
compositeDisposable.add(naskahRepository.getNaskah()
.subscribeOn(Schedulers.io())
.observeOn(mainScheduler)
.subscribeWith(new DisposableSingleObserver<List<NaskahDao>>() {
@Override
public void onSuccess(List<NaskahDao> naskahDaos) {
if (naskahDaos.isEmpty()) {
mainView.setFetchNaskahListError(true);
} else {
// Collections.sort(naskahDaos1);
mainView.updateNaskahList(naskahDaos);
mainView.setFetchNaskahListError(false);
}
}
@Override
public void onError(Throwable e) {
mainView.setFetchNaskahListError(true);
}
}));
}
rxJavaVersion = 2.1.16
rxAndroidVersion = 2.0.2
@Override
protected void onCreate (Bundle savedInstanceState) { ...
rvListNaskah.setHasFixedSize(true);
mLayoutManager = new LinearLayoutManager(this);
databaseNaskah = new NaskahDbImpl(getApplication());
mainPresenter = new MainPresenter(this, databaseNaskah,
AndroidSchedulers.mainThread());
listNaskah = new ArrayList<>();
mainPresenter.fetchNaskah();
if (!listNaskah.isEmpty()) {
rvNaskahAdapter = new MainNaskahAdapter(this, listNaskah);
rvListNaskah.setAdapter(rvNaskahAdapter);
rvListNaskah.setLayoutManager(mLayoutManager);
}
}
Я пытаюсь отладить его снова и обнаружил, что он вызвал onSuccess, но не обновил RecyclerView Снимок экрана отладчика
это метод Activity
@Override
public void updateNaskahList(List<NaskahDao> naskahDaos) {
listNaskah = naskahDaos;
Log.d("naskahDaos", naskahDaos.toString());
rvNaskahAdapter = new MainNaskahAdapter(this, listNaskah);
rvNaskahAdapter.notifyDataSetChanged();
rvListNaskah.setAdapter(rvNaskahAdapter);
}
Это связано с тем, что fetchNaskah вызывает getNaskah в потоке, отличном от потока пользовательского интерфейса, сначала следует установить recyclearview.
@Override
protected void onCreate(Bundle savedInstanceState) {
...
rvListNaskah.setHasFixedSize(true);
mLayoutManager = new LinearLayoutManager(this);
databaseNaskah = new NaskahDbImpl(getApplication());
mainPresenter = new MainPresenter(this, databaseNaskah,
AndroidSchedulers.mainThread());
listNaskah = new ArrayList<>();
mainPresenter.fetchNaskah();
// if (!listNaskah.isEmpty()) {
// rvNaskahAdapter = new MainNaskahAdapter(this, listNaskah);
// rvListNaskah.setAdapter(rvNaskahAdapter);
// rvListNaskah.setLayoutManager(mLayoutManager);
// }
rvListNaskah.setLayoutManager(mLayoutManager);
}
if line, о котором я говорил выше, будет работать, если fetchNaskah вызовет getNaskah синхронно. Поэтому я просто прокомментировал это и установил диспетчер компоновки, не проверяя список, если он пуст, потому что список появится позже.




Я предполагаю, что compositeDisposable уже был удален и, таким образом, удаляет новую наблюдаемую при добавлении.
Тогда без subscribeOn он будет работать, потому что он синхронно завершает наблюдаемое, то есть завершается до того, как CompositeDisposable.add когда-либо вызывается. Это означает, что он может закончить работу до того, как будет утилизирован.
Простите за поздний ответ. Да, когда я пытаюсь отладить его с помощью отладчика, он показывает disposed true. Я не знаю, как это сделать правильно. Не могли бы вы дать какой-нибудь ресурс, который я могу прочитать, я пытаюсь написать статьи об этом, но не могу понять, как правильно использовать rxjava2. Я слежу за этим видео на ytb ссылка на сайт
Извините за поздний ответ, это действие, которое вызывает
fetchNaskah()