2010-11-26 62 views
2

我在“hello world”风格的应用中实现了一个简单的观察者模式。如何使用观察者更新我的UI?

我有2个按钮,在Service上调用onStart()onDestroy()

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

无论如何,我可以将message吐出到我的用户界面上吗?我只是希望将它显示在活动上,即使是普通的textView也可以。

+0

不要直接调用onStart()和onDestroy()。这是非常糟糕的。 – Falmarri 2010-11-27 00:20:46

回答

2

服务不应该显示任何用户界面。唯一可接受的方法是显示可通过意向启动活动的notification。您的服务还可以使用BroadcastReceiver与您的用户界面进行通信,或者它可以直接开始活动。

如果以某种方式在后台线程上调用了您的活动,则可以使用runOnUiThread使其在主线程上运行。一般来说,你也应该熟悉services