在rxjava2中使用多线程,但未传递给onSuccess或onError

时间:2018-07-08 03:46:14

标签: java android multithreading rx-java2

我是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将起作用。因此,我只是对其进行了注释,并设置了布局管理器,而没有检查列表是否为空,因为列表将稍后出现。

1 个答案:

答案 0 :(得分:0)

我的猜测是compositeDisposable已被处置,因此在添加新的可观察对象时会对其进行处置。

然后如果没有subscribeOn,它将起作用,因为它同步完成了可观察对象,这意味着它将在调用CompositeDisposable.add之前完成。这意味着它可以在处置之前完成。