Как ждать обновленного значения в деятельности - PullRequest
0 голосов
/ 23 февраля 2012

У меня есть активность, которая отображает число. Число получается из SharedPreferences например

int num=pref.getInt(myAsyncTask.MYNUMBER,0);

SharedPreference загружается в AsyncTask, где происходят вычисления (которые включают в себя получение данных из db и т. Д.). Итак, OnCreate() действия, которое я запускаю Asynctask, чтобы вычислить значение. Однако значение не всегда обновляется до последнего при запуске операции. Это может быть связано с тем, что Asynctask требуется больше времени для вычисления нового значения, чем действие по отображению значения внутри действия. Как я могу отложить выполнение метода, отображающего значение, до тех пор, пока Asynctask не завершится с процессом нового?

[[EDIT]] Я удалил общие предпочтения. Я использую метод onPostExecute(), чтобы получить результат. Тем не менее, поведение аналогично. Результат возвращается после отображения значения, поэтому я ничего не вижу.

Ответы [ 3 ]

0 голосов
/ 23 февраля 2012

Если значение не отображается как правильное во время запуска действия, вам следует установить видимость View на View.GONE, чтобы он не отображался, а затем изменить видимость обратно на видимую, когда у вас будет результат.Чтобы обновить значение, вы можете реализовать прослушиватель для вашей активности, который вызывается AsyncTask.

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

0 голосов
/ 24 февраля 2012

Если вычисление занимает не более нескольких секунд, самое простое решение - использовать AsyncTask.get () , этот метод заблокирует выполнение потока пользовательского интерфейса и заставит поток пользовательского интерфейса ожидать завершения AsyncTask:

public void onCreate(Bundle savedInstanceState) {
  ... ...
  MyAsyncTask myAsyncTask = nee MyAsyncTask();
  myAsyncTask.execute();
  myAsyncTask.get(); // alternatively you can use AsyncTask.(long timeout, TimeUnit unit)
  ... ...
}

Имейте в виду, что он блокирует выполнение потока пользовательского интерфейса, если ваш расчет дольше 5 секунд, вы, вероятно, получите исключение ANR.

Поскольку вы уже используете AsyncTask, более разумноРешение заключается в перемещении выполнения метода, отображающего значение, в AsyncTask.onPostExecute (), это как раз та причина, по которой AsyncTask существует в API для решения такого рода сценария if.

0 голосов
/ 23 февраля 2012

Просто используйте концепцию listener или просто «передайте» свою активность асинхронной задаче, чтобы она могла вызывать основной поток.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...