Как я могу обновить свой интерфейс с помощью наблюдателя? - PullRequest
2 голосов
/ 27 ноября 2010

Я реализовал простой шаблон Observer в приложении в стиле «hello world».

У меня есть 2 кнопки, которые вызывают onStart() и onDestroy() для Service.

В onStart() я регистрирую наблюдателя, а затем заставляю своего наблюдателя запускать цикл for, вызывая observe.update() один раз в секунду в течение 10 секунд.Это в свою очередь вызывает метод update() в моем сервисе.

Я пытаюсь отобразить некоторые фиктивные данные, которые возвращаются, но я получаю следующую ошибку:

11-26 23:21:12.829: ERROR/AndroidRuntime(676): FATAL EXCEPTION: Thread-8
        java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
        at android.os.Handler.<init>(Handler.java:121)
        at android.widget.Toast.<init>(Toast.java:68)
        at android.widget.Toast.makeText(Toast.java:231)
        at com.jameselsey.observerpattern.LocalService.observe(LocalService.java:27)
        at obs.Stub$1.run(Stub.java:49)
        at java.lang.Thread.run(Thread.java:1096)

В своем сервисе я делаю следующее:

public void observe(String message)
    {
        Context context = getApplicationContext();
        Log.d("TEST", "Inside observe() on service, value is " + message);

        Toast toast = Toast.makeText(context, message, Toast.LENGTH_SHORT);
        toast.show();
    }

После небольшого исследования кажется, что я не могу создать сообщение Toast, так как этот метод не работает в основном потоке пользовательского интерфейса.

Могу ли я в любом случае выплюнуть message на свой интерфейс?Я просто смотрю, чтобы он отображался на активности, даже обычный textView в порядке.

1 Ответ

2 голосов
/ 27 ноября 2010

Сервисы не должны показывать какой-либо пользовательский интерфейс. Единственным приемлемым подходом является отображение уведомления , которое может начать действие через намерение. Ваша служба также может взаимодействовать с вашим пользовательским интерфейсом, используя BroadcastReceiver , или она может запускать действие напрямую.

Если каким-то образом ваша деятельность вызывается в фоновом потоке, вы можете запустить ее в основном потоке, используя runOnUiThread . Вам также следует подробно ознакомиться с услугами в целом.

...