在rxjava2中使用多线程,但它没有';不能传递给成功者或错误者
我不熟悉android中的RxJava,并尝试调用方法来查询SQLite。当使用同一线程时,它成功地将查询结果传递给视图。但是,当我试图通过使用在rxjava2中使用多线程,但它没有';不能传递给成功者或错误者,java,android,multithreading,rx-java2,Java,Android,Multithreading,Rx Java2,我不熟悉android中的RxJava,并尝试调用方法来查询SQLite。当使用同一线程时,它成功地将查询结果传递给视图。但是,当我试图通过使用subscribeOn()来使用不同的trhead时,它不起作用。如何解决这个问题 public void fetchNaskah() { compositeDisposable.add(naskahRepository.getNaskah() .subscribeOn(Schedulers.io()) .observeOn(mainSc
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);
}
}));
创建时受保护的void(Bundle savedInstanceState){
rvListNaskah.setHasFixedSize(true);
mLayoutManager=新的LinearLayoutManager(此);
databaseNaskah=newnaskhdimpl(getApplication());
mainPresenter=新的mainPresenter(这是databaseNaskah,
AndroidSchedulers.mainThread());
listNaskah=newarraylist();
mainPresenter.fetchNaskah();
如果(!listNaskah.isEmpty()){
rvNaskahAdapter=新的MainNaskahAdapter(此为listNaskah);
rvListNaskah.setAdapter(rvNaskahAdapter);
rvListNaskah.setLayoutManager(mLayoutManager);
}
}
我再次尝试调试它,发现它调用了onSuccess,但它没有更新RecyclerView
这是活动方法
@Override
public void updateNaskahList(List<NaskahDao> naskahDaos) {
listNaskah = naskahDaos;
Log.d("naskahDaos", naskahDaos.toString());
rvNaskahAdapter = new MainNaskahAdapter(this, listNaskah);
rvNaskahAdapter.notifyDataSetChanged();
rvListNaskah.setAdapter(rvNaskahAdapter);
}
@覆盖
公共void updateNaskahList(列表naskahDaos){
listNaskah=naskahDaos;
Log.d(“naskhadaos”,naskhadaos.toString());
rvNaskahAdapter=新的MainNaskahAdapter(此为listNaskah);
rvNaskahAdapter.notifyDataSetChanged();
rvListNaskah.setAdapter(rvNaskahAdapter);
}
解决了的
这是因为fetchNaskah调用getNaskah在与UI线程不同的线程中,因此应首先设置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);
}
@覆盖
创建时受保护的void(Bundle savedInstanceState){
...
rvListNaskah.setHasFixedSize(真);
mLayoutManager=新的LinearLayoutManager(此);
databaseNaskah=newnaskhdimpl(getApplication());
mainPresenter=新的mainPresenter(这是databaseNaskah,
AndroidSchedulers.mainThread());
listNaskah=newarraylist();
mainPresenter.fetchNaskah();
//如果(!listNaskah.isEmpty()){
//rvNaskahAdapter=新的MainNaskahAdapter(此为listNaskah);
//rvListNaskah.setAdapter(rvNaskahAdapter);
//rvListNaskah.setLayoutManager(mLayoutManager);
// }
rvListNaskah.setLayoutManager(mLayoutManager);
}
如果fetchNaskah在syncronous中调用getNaskah,我上面评论的
if行将起作用。因此,我只是对其进行了注释并设置布局管理器,而没有检查列表是否为空,因为列表将稍后出现。我的猜测是,compositeDisposable
已被处置,因此在添加时处置新的可观察对象
然后,如果没有subscribeOn
,它就会工作,因为它会同步完成可观察对象,这意味着它在调用CompositeDisposable.add
之前完成。这意味着它可以在处理之前完成。抱歉,响应太晚,这是调用fetchNaskah()
抱歉响应太晚的活动。是,当我尝试使用调试器调试它时,它显示disposed true
。我不知道该怎么做。你能给我一些我能读到的资源吗?我试着读一些关于这方面的文章,但不知道如何正确地使用rxjava2。我关注这段ytb视频
@Override
public void updateNaskahList(List<NaskahDao> naskahDaos) {
listNaskah = naskahDaos;
Log.d("naskahDaos", naskahDaos.toString());
rvNaskahAdapter = new MainNaskahAdapter(this, listNaskah);
rvNaskahAdapter.notifyDataSetChanged();
rvListNaskah.setAdapter(rvNaskahAdapter);
}
@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);
}