2

我在“hello world”风格的应用程序中实现了一个简单的观察者模式。

我有 2 个按钮,分别调用onStart()onDestroy()Service.

onStart()我注册一个观察者,然后让我的观察者observe.update()每秒运行一次 for 循环调用,持续 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 消息,因为此方法不在主 UI 线程上运行。

反正我可以吐message到我的用户界面上吗?我只是想让它显示在活动中,即使是常规的 textView 也可以。

4

1 回答 1

2

服务不应该显示任何 UI。唯一可接受的方法是显示可以通过意图启动活动的通知。您的服务还可以使用BroadcastReceiver与您的 UI 进行通信,也可以直接启动活动。

如果您的活动以某种方式在后台线程上被调用,您可以使用runOnUiThread 让它在主线程上运行。您还应该对一般服务非常熟悉。

于 2010-11-26T23:57:46.950 回答