Возвращаемое значение изнутри Runnable - PullRequest
0 голосов
/ 15 мая 2018

Я использую 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 голосов
/ 15 мая 2018

Как уже упоминалось, вы не можете вернуть значение асинхронно. И я бы посоветовал не использовать статические служебные методы для работы с БД. Кроме того, 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 -> {});
...