Android Просмотр обновления приложения со значением из базы данных - PullRequest
0 голосов
/ 09 июля 2020

Итак, в настоящее время я нахожусь на ранней стадии написания приложения Android в Java, используя Android Studio. У меня есть MainActivity, который состоит из TextView и Button.

Идея состоит в том, что когда я нажимаю кнопку, объект-объект извлекается из базы данных комнаты, а элемент-строка извлекается из объект, а затем используется для установки нового текста для TextView. Я бы предпочел сделать это таким образом, чтобы при нажатии кнопки из базы данных извлекался новый объект и обновлялся TextView, и все это без необходимости запускать новое действие.

Метод onClick для кнопки В своей первой версии выглядело примерно так:

private void getFoo() {
    Foo foo = db.fooDao().getRandom();
    String fooName = foo.getFooName();
    textFoo.setText(fooName);
}

Первая проблема заключалась в том, что я попытался получить объект из базы данных как есть, в основном потоке, что не понравилось компилятору. Пытался обернуть взаимодействие с базой данных в отдельный поток, но тогда мне пришлось либо выяснить, как сделать значение, полученное внутри потока, доступным за его пределами, либо мне пришлось вложить вызов runOnUiThread в мой метод Thread run () .

У меня были смешанные результаты: с одной конфигурацией вы могли видеть, что новый текст отображается на экране, и через долю секунды после этого приложение вылетало.

Могу ли я сделать эту работу как обновление моего представления в рамках того же действия, или я должен вместо этого просто начать новый?

1 Ответ

0 голосов
/ 10 июля 2020

Хорошо, я пропустил другой вопрос SO , который отлично решил мою проблему. Мой код для моего getFoo теперь в основном выглядит так и выполняет намеченную функцию:

private void getFoo() {
    class LoadFooTask extends AsyncTask<Void, Void, Foo> {
        @Override
        protected Foo doInBackground(Void... voids) {
            return db.fooDao().getRandom();
        }

        @Override
        protected void onPostExecute(Foo foo) {
            String FooName = foo.getFooName();
            textFoo.setText(fooName);
        }
    }
    LoadDishTask loadDishTask = new LoadDishTask();
    loadDishTask.execute();
}

Асинхронная задача загрузки из базы данных выполняется внутри метода doInBackground (), а обновление пользовательского интерфейса выполняется в основном поток через метод onPostExecute ().

...