Фатальное исключение в планировщике - rxJava2 в Android

Я знакомлюсь с rxJava2 в Android с MVP.

Для начальных шагов я создал объекты Activity, Presenter и Model (каждый из них имеет класс интерфейса).

В своей деятельности я создаю презентатор и пытаюсь загрузить данные, уведомляя представление, когда оно будет готово:

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

Кажется очень простым, и это должно быть тостом, поскольку три книги возвращаются правильно... но при выполнении он выдает исключение:

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)

В Unitary Test (Mockito) вроде все работает нормально, но вместе не получается. Мои подозрения в том, что есть какая-то проблема с потоком. Кто-нибудь может помочь мне с этой проблемой?

Кроме того, зная, что я хотел бы использовать модернизацию, правильный ли подход я использую? Или, может быть, поток должен управляться в классе Model/Repository?

Надеюсь, информации, которую я предоставил, достаточно, чтобы прояснить, в чем проблема.

Заранее спасибо!


person Alex_ES    schedule 04.09.2017    source источник


Ответы (1)


Обратите внимание на эту строку в трассировке стека:

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

Вы пытаетесь получить доступ к ресурсу String с недопустимым идентификатором ресурса. Вот где это происходит:

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

Второй аргумент должен быть String сообщением или int идентификатором ресурса. Вы передаете здесь int, поэтому компилятор выбирает перегрузку с идентификатором ресурса (очевидно, недопустимым).

Если вы хотите просто напечатать int, вы должны передать его String представление:

Toast.makeText(this, Integer.toString(shelfList.size()), Toast.LENGTH_LONG).show();
person Maksim Ostrovidov    schedule 05.09.2017
comment
О чувак! Так что сосредоточьтесь на многопоточности и вещах rxJava, и проблема заключалась в следующем... Мне неловко... Спасибо! - person Alex_ES; 05.09.2017