android中调度程序rxjava2上引发了java致命异常

xwbd5t1u  于 2021-07-03  发布在  Java
关注(0)|答案(1)|浏览(458)

我向大家介绍我自己的rxjava2在android中使用mvp。
对于初始步骤,我创建了一个活动、一个presenter和一个模型对象(每个对象都有一个接口类)。
在“活动”中,我创建演示者,并尝试加载数据,在视图准备就绪时通知视图:

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.my_activity);

    MvpPresenter presenter = new Presenter(this,
            AndroidSchedulers.mainThread());

    presenter.loadData();

在presenter内部,在loaddata方法上,只需回调以查看

@Override
public void loadData() {

    compositeDisposable.add(dataRepository.getDataList().
            subscribeOn(Schedulers.io()).
            observeOn(mainScheduler).
            subscribeWith(new DisposableSingleObserver<List<Book>>() {
                @Override
                public void onSuccess(@NonNull List<Book> bookList) {
                    if (!bookList.isEmpty())
                        view.displayBooks(bookList);
                    else
                        view.displayEmpty();
                }

                @Override
                public void onError(@NonNull Throwable e) {
                    view.displayError("boooom");
                }
            }));
    }

方法getbooks()如下所示(我想使用一个api,但到目前为止,为了简单起见,我只对数据进行了硬编码)

public Single<List<Shelf>> getShelfList() {
    return Single.fromCallable(new Callable<List<Book>>() {
        @Override
        public List<Book> call() throws Exception {
            Book b1 = new Book();
            Book b2 = new Book();
            Book b3 = new Book();

            List<Book> bookList = Arrays.asList(b1,b2,b3);
            return bookList;
        }
    });
}

方法view.displaybooks(booklist)只有一条toast消息(同样,为了简单起见)

public void displayBooksInShelf(List<Shelf> shelfList) {
        Toast.makeText(this, shelfList.size(), Toast.LENGTH_LONG).show();
    }

看起来很简单,应该是祝酒词,因为三本书都被正确地归还了。。。但在执行时,它会抛出一个异常:

java.lang.IllegalStateException: Fatal Exception thrown on Scheduler.
 at io.reactivex.android.schedulers.HandlerScheduler$ScheduledRunnable.run(HandlerScheduler.java:111)
 at android.os.Handler.handleCallback(Handler.java:751)
 at android.os.Handler.dispatchMessage(Handler.java:95)
 at android.os.Looper.loop(Looper.java:154)
 at android.app.ActivityThread.main(ActivityThread.java:6077)
 at java.lang.reflect.Method.invoke(Native Method)
 at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:866)
 at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:756)
Caused by: android.content.res.Resources$NotFoundException: String resource ID #0x2
 at android.content.res.Resources.getText(Resources.java:331)
 at android.widget.Toast.makeText(Toast.java:287)

在单一测试(mockito)中,一切看起来都很好,但一起就失败了。我的怀疑是有某种线程问题。有人能帮我解决这个问题吗?
另外,知道我想使用改装,我使用的方法是正确的吗?或者线程应该在model/repository类中管理?
希望我提供的信息足以说明问题所在
提前谢谢!

dohp0rv5

dohp0rv51#

注意stacktrace中的这一行:

Caused by: android.content.res.Resources$NotFoundException: String resource ID #0x2

您正在尝试访问 String 资源id无效的资源。发生这种情况的地方:

Toast.makeText(this, shelfList.size(), Toast.LENGTH_LONG).show();

第二个参数必须是 String 消息或 int 资源id。您正在传递 int 在这里,编译器选择带有资源id的重载(显然是无效的)。
如果你只想打印 int 你必须通过 String it代表:

Toast.makeText(this, Integer.toString(shelfList.size()), Toast.LENGTH_LONG).show();

相关问题