代码之家  ›  专栏  ›  技术社区  ›  Alex_ES

Android中的rxJava2调度程序引发致命异常

  •  0
  • Alex_ES  · 技术社区  · 7 年前

    我将介绍自己在Android中使用MVP的rxJava2。

    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;
            }
        });
    }
    

    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)中,一切似乎都很好,但加在一起就失败了。我怀疑存在某种线程问题。有人能帮我解决这个问题吗?

    希望我提供的信息足以澄清问题所在

    1 回复  |  直到 7 年前
        1
  •  1
  •   Maksim Ostrovidov    7 年前

    请注意stacktrace中的这一行:

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

    String 资源id无效的资源。在此处发生:

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

    第二个参数必须是 消息 int 整数 在这里,编译器选择带有资源id的重载(显然无效)。

    整数 你必须通过 一串

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