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

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

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

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

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

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

Благодарю.

Solutions Collecting From Web of "Выполнить код в основном потоке в Android без доступа к активности?"

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

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

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

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

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

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

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

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

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

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

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