2010-11-26 7 views
2

"hello world"スタイルのアプリで単純なObserverパターンを実装しました。オブザーバーを使用してUIを更新するにはどうすればよいですか?

ServiceにはonStart()onDestroy()という2つのボタンがあります。

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(); 
    } 

少しの研究の後、このメソッドはメインのUIスレッドでは実行されないため、Toastメッセージを作成できないようです。

私のUIにmessageを吐き出すことができますか?私はそれをactivitiyに表示させたいだけで、通常のtextViewでもOKです。

+0

onStart()とonDestroy()を直接呼び出さないでください。それは信じられないほど悪いです。 – Falmarri

+0

こんにちはFalmarri、私は、アクティビティのメソッドにマップされている2つのボタンがあり、それらのアクティビティはonStart/onDestroyを呼び出します。それでも悪いですか?何が最高ですか?.. – Jimmy

答えて

2

サービスではUIが表示されません。受け入れ可能な唯一の方法は、インテントを通じてアクティビティを開始できるnotificationを表示することです。あなたのサービスは、BroadcastReceiverを使用してあなたのUIと通信することもできますし、直接活動を開始することもできます。

何らかのアクティビティがバックグラウンドスレッドで呼び出された場合は、runOnUiThreadを使用してメインスレッド上でアクティビティを実行させることができます。また、一般的にはservicesに親しまれるべきです。

関連する問題