Обновление пользовательского интерфейса активности из другого метода активности? - PullRequest
2 голосов
/ 05 мая 2010

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

Лучшим подходом, по-видимому, было использование AsyncTask в моем основном классе TabActivity, поскольку это позволило бы избежать любых проблем, связанных с разрушением активности чата в фоновом режиме во время работы AsyncTask. Я хотел убедиться, что действие не будет уничтожено и воссоздано, поэтому моя AsyncTask не сможет изменить данные действительного активного действия.

Однако теперь, когда мой AsyncTask находится в действии TabActivity, у меня больше нет прямого способа вызвать ListAdapter моего чата notifyDataSetChanged() из моего метода onPostExecute(). Есть ли способ получить ссылку на текущую активность данной вкладки из TabHost / TabActivity?

Или, в качестве альтернативы, могу ли я предположить, что моя активность в чате никогда не будет уничтожена как дочерняя активность действия TabActivity (ну, никогда не будет уничтожена, пока активна TabActivity), а затем просто вставить AsyncTask в действие чата?

Ответы [ 2 ]

2 голосов
/ 05 мая 2010

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

Но будьте осторожны: любое действие может быть прервано в любое время (например, если пользователь нажимает на ссылку на вкладке, которая открывает новое действие во времяВаша задача все еще выполняется), включая сам Tabhost, который может привести к ужасным сбоям, когда задача возвращается и пытается обновить пользовательский интерфейс ныне мертвой Активности.Поэтому обязательно отмените AsyncTasks при уничтожении, попросите asynctasks проверить, активна ли ваша активность, прежде чем возвращать результаты (см. WeakAsyncTask в дереве исходного кода Android), или используйте независимое от Activity (полу) постоянное решение для фоновых потоков, напримерCaseyB предлагает ( cwac-bus - хорошее готовое решение в этом духе).

В качестве альтернативы вы могли бы просто сделать так, чтобы код обновления пользовательского интерфейса AsyncTask перехватывал все исключения (я видел несколько приложений, которые делают это) и молча терпел неудачу, но это пахнет странно для меня. * В последнее время *Я использовал модифицированную версию WeakAsyncTask в большинстве мест, которая проверяет, что действие не завершено при возвращении лично.

2 голосов
/ 05 мая 2010

Действительно лучший способ сделать это - запустить поток, который периодически получает данные чата. Затем из вашего пользовательского интерфейса вы можете опросить поток, чтобы получить новые сообщения. Таким образом, вы можете запустить поток независимо от того, что происходит с Activity.

...