2010-05-04 3 views
1

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

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

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

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

ответ

2

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

+0

Модифицированная версия этого сработала прекрасно: в моей работе с чатом я создаю поток и создаю обработчик в этом потоке для запуска моих периодических загрузок. После успешной загрузки я обновляю набор данных адаптера внутри 'runOnUIThread()'. Затем я планирую следующий цикл обновления с помощью метода 'postDelayed()' моего обработчика. И когда моя активность уничтожается, я использую 'handler.removeCallback()' в моем обновлении Runnable. Благодаря! – stormin986

2

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

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

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

В последнее время я использовал модифицированную версию WeakAsyncTask в большинстве мест, которая проверяет, что операция не завершена при возврате лично.

Смежные вопросы