AsyncTask, AsynTaskLoader или исполнитель с ViewModel, LiveData и комнатой? - PullRequest
0 голосов
/ 12 марта 2019

Во-первых, я не знаю всего в Android и Java, я работаю над этим, если вы обнаружите недостаток знаний в моем вопросе.

Когда я читаю о преимуществах Loaders , я читаю, что загрузчики работают в отдельных потоках, чтобы предотвратить не отвечающий пользовательский интерфейс.

После появления и чтения ViewModel и LiveData и Комната и после прочтения этого поста , особенно в разделе Наблюдение за данными , в которых говорится

В мире Loader получение ваших данных в пользовательском интерфейсе потребует LoaderManager, звоните initLoader() в нужное место и строите>? LoaderCallbacks. Мир немного проще в Компоненты архитектуры мира. и т.д ..

и следующий раздел

Загрузите все вещи , о которых говорится во втором абзаце

Например, Room позволяет вам получать наблюдаемые запросы - запросы к базе данных. которые возвращают LiveData, чтобы изменения базы данных автоматически распространялись через ваш ViewModel на ваш пользовательский интерфейс. Вроде как CursorLoader без касаясь курсоров или загрузчиков.

Все вышеперечисленное подразумевает, что ViewModel и LiveData с Room могут работать в фоновом потоке , я имею в виду, когда мы используем ViewModel и LiveData с Room вместо Loaders , нам не нужно было использовать AsyncTask или AsyncTaskLoader или Executer

Но в этих примерах:

android-room-with-a-view , который можно использовать как шаблон, как говорят в README.md,

В MainActivity.java они пишут mWordViewModel.getAllWords().observe(this, .... ;, и если мы глубоко проследим getAllWords(), мы обнаружим, что функция представляет собой запрос select , но когда они хотят вставить данные в WordRepository.java или WordRoomDatabase.java они используют AsyncTask ,

Я имею в виду, почему они использовали ViewModel и LiveData и Dao с запросом , выберите и в запросе insert они включают в комплекте AsyncTask с ViewModel и Dao ?, потому что то, что подразумевается выше ViewModel и LiveData с Комната может работать в фоновом потоке ?

Мой предыдущий вопрос относится к этому примеру android-persistence на шаге 3_solution я имею в виду получить только данные ViewModel , но вставить данные как в DatabaseInitializer.java , AsyncTask включено в комплекте?

Также в этом примере BasicSample , Исполнитель включает включается , когда данные должны быть вставлены ?

Большое спасибо

Ответы [ 2 ]

0 голосов
/ 14 марта 2019

В MainActivity.java пишут mWordViewModel.getAllWords (). Наблюдать (это, ....; и если мы глубоко проследим getAllWords (), мы обнаружим, что функция является запросом выбора,

Действительно, getAllWords() выставляется из Room DAO как LiveData<List<T>>, поэтому его можно наблюдать, и внутренне Room будет обрабатывать задачу асинхронного извлечения (выполняется на ArchTaskExecutor.io(), который является двухпоточным исполнителем ).

@Query("SELECT * from word_table ORDER BY word ASC")
LiveData<List<Word>> getAlphabetizedWords();

Однако, если у вас есть insert, то в Room DAO это синхронный метод, поэтому они не обрабатывают потоки для вас.


AsyncTask - это один из конкретных способов выполнения вашего кода на исполняющем устройстве Android по умолчанию (читай: фоновый поток) для фоновых задач:

public static final Executor SERIAL_EXECUTOR = new SerialExecutor();
private static volatile Executor sDefaultExecutor = SERIAL_EXECUTOR;

Выполняет каждую задачу последовательно.



Так что ответ на ваш вопрос таков, потому что запросы и вставки работают по-разному.

Запросы, представленные как LiveData, отслеживают недействительность базовой базы данных и повторно запрашивают набор результатов для вас, если вы сделали запись, которая изменила бы эту таблицу. Таким образом, вам не нужно вручную запрашивать базу данных, когда вы делаете запись, которая изменяет элементы в определенной таблице. На самом деле это очень удобно.

Вставки просто, вставки. Таким образом, они не делают магию для вас в этом случае.

0 голосов
/ 12 марта 2019

Все вышесказанное подразумевает, что ViewModel и LiveData с Room могут работать в фоновом потоке, я имею в виду, что когда мы используем ViewModel и LiveData с Room вместо Loaders, нам не нужно было использовать AsyncTask или AsyncTaskLoader или Executer

Они не. Они работают в текущем потоке, они были выполнены. Именно поэтому в приведенном вами примере они по-прежнему использовали AsyncTask для перемещения работы в фоновый поток.

Также обратите внимание, что MutableLiveData имеет два метода для установки своих значений.

public void postValue(T value) {
    super.postValue(value);
}

public void setValue(T value) {
    super.setValue(value);
}

postValue(value) используется для установки значения MutableLiveData в фоновом потоке. Вызов setValue(value) в фоновом режиме вызовет исключение, если я правильно помню.

Кроме того, загрузчики устарели с API 28. Вы можете прочитать это здесь .

Начиная с Android P загрузчики устарели (API 28). Рекомендуемый вариант для загрузки данных при обработке жизненных циклов Activity и Fragment - использовать комбинацию ViewModels и LiveData. ViewModels переживают изменения конфигурации, такие как загрузчики, но с меньшим количеством шаблонов. LiveData предоставляет способ загрузки данных с учетом жизненного цикла, который вы можете использовать в нескольких моделях представления. Вы также можете комбинировать LiveData, используя MediatorLiveData, и любые наблюдаемые запросы, например запросы из базы данных Room, можно использовать для наблюдения за изменениями данных. ViewModels и LiveData также доступны в ситуациях, когда у вас нет доступа к LoaderManager, например в Сервисе. Использование двух в тандеме обеспечивает простой способ доступа к данным, в которых нуждается ваше приложение, без необходимости иметь дело с жизненным циклом интерфейса пользователя. Чтобы узнать больше о LiveData, см. Руководство LiveData, а чтобы узнать больше о ViewModel, см. Руководство ViewModel.

...