Невозможно вызвать наблюдение в фоновом потоке при вызове метода живых данных - PullRequest
0 голосов
/ 19 июня 2020

нужна ваша помощь.

У меня есть считыватель кода qr, который принимает мне какой-то объект.

С другой стороны, у меня есть объект LiveData из SQLite (Room).

Когда я получаю объект от QRScanner, я пытаюсь вызвать объект живых данных из базы данных, чтобы проверить, завершился ли он (по строке).

Но у меня есть ошибка, которая говорит:

E/CameraSource: Exception thrown from receiver.
    java.lang.IllegalStateException: Cannot invoke observe on a background thread
        at androidx.lifecycle.LiveData.assertMainThread(LiveData.java:462)
        at androidx.lifecycle.LiveData.observe(LiveData.java:189)
        at com.msapps.movieapp.view.fragments.QRCodeScannerFragment.onQRScanned(QRCodeScannerFragment.java:108)
        at com.msapps.movieapp.view.fragments.-$$Lambda$PGtfO3ziWSk5mvcCZ1yOj6ZqQtU.onQRScanned(Unknown Source:2)
        at com.msapps.movieapp.utils.QRScanner$2.receiveDetections(QRScanner.java:100)

Вот мой QRScanner.

        @Override
        public void receiveDetections(Detector.Detections<Barcode> detections) {
            final SparseArray<Barcode> barcodes = detections.getDetectedItems();
            if (barcodes.size() != 0) {
                Gson gson = new Gson();
                MoviesResponse moviesResponse = gson.fromJson(barcodes.valueAt(0).displayValue, MoviesResponse.class);
                iCallback.onQRScanned(moviesResponse);
            }
        }
    });
}

public interface QRCodeInterface{
    void onQRScanned(MoviesResponse response);

}

С интерфейсом iCallback я передаю данные во фрагмент:

А во фрагменте делаю следующее:

@Override
public void onQRScanned(MoviesResponse response) {
    mMoviesViewModel.getMovieByTitle(response.getTitle()).observe(QRCodeScannerFragment.this, new Observer<MoviesResponse>() {
        @Override
        public void onChanged(MoviesResponse moviesResponse) {
            mTVMovieTitle.setText(response.getTitle());
        }
    });
}

GetMovieByTitle из класса репо:

public LiveData<MoviesResponse> getMovieByTitle(String movieTitle) {
    return movieDao.getMovie(movieTitle);
}

И запрос от Дао

@Query("select * from movies where movie_title ==:title")
LiveData<MoviesResponse> getMovie(String title);

Кто-нибудь может помочь?

1 Ответ

0 голосов
/ 19 июня 2020

Если вам нужно получить данные из Room в фоновом потоке, не используйте LiveData. Либо:

  • Используйте синхронный метод (поскольку вы уже находитесь в фоновом потоке), либо

  • Используйте Rx Java, или

  • Используйте Kotlin сопрограммы (как только вы Kotlin измените свой проект)

Это может потребовать от вас наличия параллельных методов в вашем DAO , если вам нужно получить данные как из основного потока приложения (используя LiveData), так и из фонового потока:

@Query("select * from movies where movie_title ==:title")
LiveData<MoviesResponse> getMovie(String title);

@Query("select * from movies where movie_title ==:title")
MoviesResponse getMovieSynchronously(String title);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...