调度程序抛出致命异常 - Android 中的 rxJava2
Fatal Exception thrown on Scheduler - rxJava2 in Android
我在 Android 中使用 MVP 向 rxJava2 介绍自己。
对于初始步骤,我创建了一个 Activity、一个演示者和一个模型对象(每个对象都有一个接口 class)。
在我的 activity 中,我创建了演示者,并尝试加载数据,并在准备就绪时通知视图:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.my_activity);
MvpPresenter presenter = new Presenter(this,
AndroidSchedulers.mainThread());
presenter.loadData();
在演示者内部,在 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();
}
看起来很简单,应该正确返回三本书的Toast...但是执行时,抛出异常:
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 class?
中管理
希望我提供的信息足以说明问题所在
提前致谢!
注意堆栈跟踪中的这一行:
Caused by: android.content.res.Resources$NotFoundException: String resource ID #0x2
您正在尝试访问具有无效资源 ID 的 String
资源。发生的地方:
Toast.makeText(this, shelfList.size(), Toast.LENGTH_LONG).show();
第二个参数必须是String
消息或int
资源id。您在此处传递 int
,因此编译器选择具有资源 ID 的重载(显然无效)。
如果你只想打印 int
你必须传递它的 String
表示:
Toast.makeText(this, Integer.toString(shelfList.size()), Toast.LENGTH_LONG).show();
我在 Android 中使用 MVP 向 rxJava2 介绍自己。
对于初始步骤,我创建了一个 Activity、一个演示者和一个模型对象(每个对象都有一个接口 class)。
在我的 activity 中,我创建了演示者,并尝试加载数据,并在准备就绪时通知视图:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.my_activity);
MvpPresenter presenter = new Presenter(this,
AndroidSchedulers.mainThread());
presenter.loadData();
在演示者内部,在 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();
}
看起来很简单,应该正确返回三本书的Toast...但是执行时,抛出异常:
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 class?
中管理希望我提供的信息足以说明问题所在
提前致谢!
注意堆栈跟踪中的这一行:
Caused by: android.content.res.Resources$NotFoundException: String resource ID #0x2
您正在尝试访问具有无效资源 ID 的 String
资源。发生的地方:
Toast.makeText(this, shelfList.size(), Toast.LENGTH_LONG).show();
第二个参数必须是String
消息或int
资源id。您在此处传递 int
,因此编译器选择具有资源 ID 的重载(显然无效)。
如果你只想打印 int
你必须传递它的 String
表示:
Toast.makeText(this, Integer.toString(shelfList.size()), Toast.LENGTH_LONG).show();