gpt4 book ai didi

java - 调用实时数据方法时,无法在后台线程上调用观察

转载 作者:行者123 更新时间:2023-12-01 16:13:20 26 4
gpt4 key购买 nike

需要你的帮助。

我有一个二维码阅读器,可以接收一些对象。

在另一边,我有来自 SQLite (Room) 的 LiveData 对象。

当我从 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 接口(interface),我将数据传递给 fragment :

在 fragment 中我执行下一步:

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

从存储库类获取MovieByTitle:

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

以及来自 Dao 的查询

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

有人可以帮忙吗?

最佳答案

如果您需要在后台线程上从 Room 获取数据,请勿使用 LiveData。要么:

  • 使用同步方法(因为您已经在后台线程上),或者

  • 使用 RxJava,或

  • 使用 Kotlin 协程(一旦您对项目进行了 Kotlin 化)

如果您需要从主应用程序线程(使用 LiveData)和后台线程获取数据,这可能需要您的 DAO 中具有并行方法:

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

关于java - 调用实时数据方法时,无法在后台线程上调用观察,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62473722/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com