2010-11-26 3 views
2

"안녕하세요 세상"스타일 앱에 간단한 Observer 패턴을 구현했습니다.옵저버를 사용하여 UI를 업데이트하려면 어떻게해야합니까?

나는 ServiceonStart()onDestroy()을 호출하는 2 개의 버튼이 있습니다.

onStart()에서 관찰자를 등록한 다음 내 관찰자에게 for 루프를 실행하여 observe.update()을 10 초 동안 1 회씩 실행하도록합니다. 이것은 내 서비스에서 update() 메소드를 호출합니다.

I가 반환됩니다 일부 더미 데이터를 표시하기 위해 노력하고있어,하지만 난 다음 오류 받고 있어요 :

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 괜찮습니다.

+0

onStart() 및 onDestroy()를 직접 호출하지 마십시오. 그것은 대단히 나쁜 것입니다. – Falmarri

+0

안녕하세요 Falmarri, 나는 하나의 액티비티에있는 메소드에 매핑 된 2 개의 버튼을 가지고 있는데, 그 액티비티들은 onStart/onDestroy를 호출합니다. 아직도 나쁜가요? 무엇이 최고인가? .. – Jimmy

답변

2

서비스에 UI가 표시되지 않아야합니다. 허용되는 유일한 접근 방식은 의도를 통해 활동을 시작할 수있는 notification을 표시하는 것입니다. 서비스는 BroadcastReceiver을 사용하여 UI와 통신하거나 직접 활동을 시작할 수 있습니다.

어쨌든 활동이 백그라운드 스레드에서 호출되면 runOnUiThread을 사용하여 주 스레드에서 실행되도록 할 수 있습니다. 일반적으로 services에 친숙해야합니다.

관련 문제