我是android中的RxJava的新手,正在尝试调用方法查询SQLite。当使用同一线程时,它将成功地将查询结果传递给视图。但是,当我尝试通过使用subscribeOn()
使用不同的trhead时,它不起作用。该如何解决?
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
受保护的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 Debugger screen shot
这是“活动”方法
@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在与UI Thread不同的线程中调用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);
}
如果fetchNaskah同步调用getNaskah,则我上面评论的if line
将起作用。因此,我只是对其进行了注释,并设置了布局管理器,而没有检查列表是否为空,因为列表将稍后出现。
答案 0 :(得分:0)
我的猜测是compositeDisposable
已被处置,因此在添加新的可观察对象时会对其进行处置。
然后如果没有subscribeOn
,它将起作用,因为它同步完成了可观察对象,这意味着它将在调用CompositeDisposable.add
之前完成。这意味着它可以在处置之前完成。