Внесение изменений в основной интерфейс активности из потока в службе - PullRequest
4 голосов
/ 02 сентября 2011

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

Есть ли у кого-нибудь какие-нибудь идеи или хорошие примеры, на которые они могли бы меня направить?Элемент пользовательского интерфейса, который я изменяю, представляет собой TextView, который просто информирует пользователя о состоянии потока.

Спасибо за вашу помощь.

Ответы [ 4 ]

7 голосов
/ 02 сентября 2011

Все, что вам нужно сделать, это создать Handler в потоке пользовательского интерфейса:

private Handler serviceHandler = new Handler() {
    @Override
    public void handleMessage(Message msg) {
        someFunctionInTheUIThread();
    }
};

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

public void registerHandler(Handler serviceHandler) {
    handler = serviceHandler;
}

, а затем передать обработчик следующим образом:

theService = ((LocalBinder) service).getService();
theService.registerHandler(serviceHandler);

, а затем отправить сообщение обратно:

Message msg = handler.obtainMessage(IDENTIFIER, "Message or data");
handler.sendMessage(msg);
2 голосов
/ 02 сентября 2011

Загляните в сервисную привязку.Или вы можете использовать BroadcastReceiver в своей основной деятельности для получения трансляций от Сервиса.

1 голос
/ 02 сентября 2011

Создайте обработчик в методе onCreate () в вашей основной деятельности. Это создаст обработчик в потоке пользовательского интерфейса. Затем, используя этот обработчик из рабочего потока, вызовите все, что вам нужно, чтобы обновить TextView.

1 голос
/ 02 сентября 2011

Вы должны отправить намерение от своего сервиса с помощью sendBroadcast (намерение) и установить BroadcastReceiver в своей деятельности

...