从 Runnable 内部返回值



我正在使用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"运行?

如前所述,不能异步返回值。我建议不要使用静态实用程序方法来处理数据库。此外,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 -> {});

最新更新