从Runnable内部返回值

时间:2018-05-15 02:25:28

标签: 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 = AppDatabase.getAppDatabase(context.getApplicationContext());
            db.genreDao().getAll();
        }
    });
    return null;
}

我有什么方法可以传回这个值,但仍然在主线程上的'not'中运行?

1 个答案:

答案 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 -> {});