我正在使用Android Room,我尝试构建一个实用程序方法,从数据库中检索值。我遇到的问题是尝试从正在异步执行的Runnable内部传回值。
public static List<Genre> getAll(final Context context){
AsyncTask.execute(new Runnable() {
@Override
public void run() {
AppDatabase db = AppDatabase.getAppDatabase(context.getApplicationContext());
db.genreDao().getAll();
}
});
return null;
}
我有什么方法可以传回这个值,但仍然在主线程上的'not'中运行?
答案 0 :(得分:0)
如前所述,您无法异步返回值。我建议不要使用静态实用程序方法来处理数据库。此外,AsyncTasks使用起来很麻烦。另一种选择是Rx。例如:
@Dao
public interface GenreDao {
@Query("SELECT * FROM Genre")
List<Genre> getAll();
}
public class GenreRepository {
//...
@WorkerThread
public List<Genre> getAll() {
//Any other source management logic could be placed here, i.e. retrieving from cache or network
return genreDao.getAll();
}
}
public class GenreInteractor {
//...
public Single<List<Genre>> getAll() {
return Single
.fromCallable(genreRepository::getAll)
.subscribeOn(Schedulers.io());
}
}
然后你会检索你的类型列表:
genreInteractor.getAll().subscribe(genres -> {});
或者如果您希望回调在主线程上:
genreInteractor.getAll().observeOn(AndroidSchedulers.mainThread()).subscribe(genres -> {});