Подтвердить что ты не робот

Выполнить код в основном потоке в Android без доступа к активности?

У меня есть служба Android, которая запускает и поддерживает фоновый поток.

Время от времени фоновый поток должен выполнять обратный вызов в основном потоке. Я не понимаю, как это сделать.

Я не могу вызывать this.runOnUiThread, потому что "this" - это экземпляр службы, а не Activity, а служба не имеет метода runOnUiThread.

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

Нужно ли поддерживать ссылку на активность, использующую службу, и вызывать ее метод runOnUiThread, или есть ли другой способ запустить что-то в потоке пользовательского интерфейса?

Спасибо.

4b9b3361

Ответ 1

Я использую следующий код время от времени, если у меня нет прямого доступа к Activity (по той или иной причине);

new Handler(Looper.getMainLooper()).post(mYourUiThreadRunnable);

Ответ 2

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

Используйте LocalBroadcastManager, и служба отправит трансляцию, чтобы ее активировали по активности, которая получит ее в основном потоке приложения. Вот пример приложения, демонстрирующего это.

Или используйте "реальную" трансляцию с sendBroadcast().

Или используйте Messenger, как упоминалось you786, привязан к Handler, как упоминал Гильермо, хотя вам необязательно использовать привязку для него.

Ответ 3

Ваша активность должна связываться с сервисом.

http://developer.android.com/guide/components/bound-services.html

В частности, взгляните на создание Messenger на этой странице. Активность клиента может предоставлять объект-мессенджер, который отвечает на сообщения от службы, а после его получения запускает любой код пользовательского интерфейса в потоке пользовательского интерфейса с помощью обработчика.

НЕ сохранить ссылку на действие в службе. Это может привести к различным проблемам с памятью.

Ответ 4

Конечно. См. Handler. Вы можете предоставить своей службе объект-обработчик, и когда службе необходимо запустить некоторую задачу Runnable в потоке пользовательского интерфейса, просто нужно вызвать handler.post(some_runnable_task). Этот звонок. Можно найти пример в этой ссылке 4. Учебник: Обработчик.