Ответ 1
Я использую следующий код время от времени, если у меня нет прямого доступа к Activity (по той или иной причине);
new Handler(Looper.getMainLooper()).post(mYourUiThreadRunnable);
У меня есть служба Android, которая запускает и поддерживает фоновый поток.
Время от времени фоновый поток должен выполнять обратный вызов в основном потоке. Я не понимаю, как это сделать.
Я не могу вызывать this.runOnUiThread, потому что "this" - это экземпляр службы, а не Activity, а служба не имеет метода runOnUiThread.
Я также не могу создать или выполнить AsyncTask, потому что в документации для AsyncTask указано, что как конструктор, так и метод execute должны быть вызваны из потока пользовательского интерфейса.
Нужно ли поддерживать ссылку на активность, использующую службу, и вызывать ее метод runOnUiThread, или есть ли другой способ запустить что-то в потоке пользовательского интерфейса?
Спасибо.
Я использую следующий код время от времени, если у меня нет прямого доступа к Activity (по той или иной причине);
new Handler(Looper.getMainLooper()).post(mYourUiThreadRunnable);
Ему нужны обратные вызовы в основном потоке, чтобы он мог обновлять элементы пользовательского интерфейса.
Используйте LocalBroadcastManager
, и служба отправит трансляцию, чтобы ее активировали по активности, которая получит ее в основном потоке приложения. Вот пример приложения, демонстрирующего это.
Или используйте "реальную" трансляцию с sendBroadcast()
.
Или используйте Messenger
, как упоминалось you786, привязан к Handler
, как упоминал Гильермо, хотя вам необязательно использовать привязку для него.
Ваша активность должна связываться с сервисом.
http://developer.android.com/guide/components/bound-services.html
В частности, взгляните на создание Messenger на этой странице. Активность клиента может предоставлять объект-мессенджер, который отвечает на сообщения от службы, а после его получения запускает любой код пользовательского интерфейса в потоке пользовательского интерфейса с помощью обработчика.
НЕ сохранить ссылку на действие в службе. Это может привести к различным проблемам с памятью.
Конечно. См. Handler. Вы можете предоставить своей службе объект-обработчик, и когда службе необходимо запустить некоторую задачу Runnable в потоке пользовательского интерфейса, просто нужно вызвать handler.post(some_runnable_task). Этот звонок. Можно найти пример в этой ссылке 4. Учебник: Обработчик.