Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在rxjava2中使用多线程,但它没有';不能传递给成功者或错误者_Java_Android_Multithreading_Rx Java2 - Fatal编程技术网

在rxjava2中使用多线程,但它没有';不能传递给成功者或错误者

在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

我不熟悉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);
        }
    }));
创建时受保护的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);

}