Android 从内部返回值Runnable

Android 从内部返回值Runnable,android,runnable,android-room,Android,Runnable,Android Room,我正在使用Android Room,我尝试构建一个实用方法,从数据库中检索值。我遇到的问题是试图从异步执行的Runnable内部传回值 public static List<Genre> getAll(final Context context){ AsyncTask.execute(new Runnable() { @Override public void run() { AppDatabase db = AppDa

我正在使用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;
}
公共静态列表getAll(最终上下文){
AsyncTask.execute(新的Runnable(){
@凌驾
公开募捐{
AppDatabase db=AppDatabase.getAppDatabase(context.getApplicationContext());
db.genreDao().getAll();
}
});
返回null;
}

有什么方法可以传回此值,但仍在主线程上以“not”运行?

如前所述,不能异步返回值。我建议不要使用静态实用程序方法来处理db。此外,异步任务使用起来也很麻烦。另一个选择是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().observeOn(AndroidSchedulers.mainThread()).subscribe(genres -> {});

您不能这样做,因为它是异步的
getAll
方法在调用
execute
returnnull
后立即完成。任务在另一个线程中运行。您可以选择使您的任务变得同步,或者使用侦听器模式在不同的回调中获取值。也许侦听器模式是一种方法,我将试一试
genreInteractor.getAll().observeOn(AndroidSchedulers.mainThread()).subscribe(genres -> {});