2011-06-13 2 views
0

아래 서비스를 확장하는 MyService라는 클래스가 있습니다. 모든 것이 실행될 때까지 Thread의 run 메소드에서 Toast.makeText... 행을 제거합니다.안드로이드에서 Service 클래스의 Thread로부터 Activity의 UI 컴포넌트에 접근하기

왜? 그리고 Thread 클래스의 run 메서드에서 Activity 구성 요소에 액세스하려면 어떻게해야합니까?

public class MyService extends Service { 

@Override 
public IBinder onBind(Intent intent) { return null; } 

@Override 
public void onCreate() { 
    Toast.makeText(this, "This msg will be shown", Toast.LENGTH_LONG).show(); 
    Log.d("Bilgi", "This msg will be shown."); 
    super.onCreate(); 
} 

@Override 
public void onStart(Intent intent, int startId) { 
    Toast.makeText(this, "This msg will be shown", Toast.LENGTH_LONG).show(); 
    super.onStart(intent, startId); 

    timer.scheduleAtFixedRate(new TimerTask() { 
     @Override 
     public void run() { 
      try { 
       Log.d("This msg will ","be shown"); //if I remove next line 
       Toast.makeText(this, "This msg will NOT be shown", Toast.LENGTH_LONG).show(); 

       Thread.sleep(2000); 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 
     } 
    }, 5000, 8000); 
} 

답변

1

그리고 어떻게 Thread 클래스의 run 메소드에서 활동 구성 요소에 액세스 할 수 있습니다?

그렇지 않습니다. Messenger을 사용하여 서비스의 Message 개체를 활동의 Handler으로 보냅니다. 액티비티와 액티비티 만 위젯을 업데이트 할 수 있으며, 메인 애플리케이션 스레드에서만 업데이트 할 수 있습니다.

Here is a sample application

+0

[바인더 클래스 확장] (https://developer.android.com/guide/components/bound-services.html#Binder)을 통해 바운드 서비스를 사용할 수 있습니까? 안드로이드 문서는 "당신의 서비스가 단지 당신의 어플리케이션을위한 배경 작업자 일 때"Messenger를 사용하는 것보다이 방법을 제안하는 것으로 보인다. – AST

+1

@AST : 그것은 이벤트 버스처럼 다른 옵션 일 것이다. – CommonsWare

0

내가 아는 유일한 방법은, 활동 안에 방송 수신기를 사용하는 당신에게 당신이 원하는 메시지 및 업데이트 UI 또는 잡을 것이다있다.

1

Don't use Threads - AyncTasks을 사용하십시오. 또한 스레드/작업을 통해 Activity 메소드/UI에 액세스하면 안됩니다. 첫 번째 링크를 살펴보고 활동과 "스레드"가 어떻게 작동하는지 생각해보십시오.

0

토스트를 만들 때, 당신은 getApplicationContext을 통해 얻을 수있는 ApplicationContext를 전달()

+0

Activity에서 MyService로 컨텍스트를 전달하고, Toast.makeText (context.getApplicationContext(), "textextexte", Toast.LENGTH_SHORT)와 같은 매개 변수로 context.getApplicationContext() . 쇼();'? – uzay95

+0

아니요, Service는 Context의 확장이므로 Service 내에서 getApplicationContext()를 호출 할 수 있습니다. Toast.makeText (getApplicationContext() ..이면 MyService 클래스의 ONSTART 방법 내부 –

+0

먼저 Toast.makeText 방법은'timer.scheduleAtFixedRate (새의 TimerTask() { @Override 공공 무효 실행() { 시도 {토스트 작업 만한다. makeText ....... – uzay95

0

UI를 위젯은 스레드로부터 안전하지 않은 그래서 업데이트 할 수 없습니다 귀하의 경우, Toast 만드는 것은 금지되어 다른 스레드에, 주 (UI) 스레드에서하지 않는 한 UI 위젯.

Handler과 같은 것을 사용해야하고 Messenger을 사용하면 활동 UI 스레드에서 생성 된 처리기로 메시지를 보낼 수 있습니다. 그런 다음 방법 handleMessage(Message msg)에서 위젯을 처리하십시오.

관련 문제