2012-10-16 3 views
0

나는 서비스를 시작할 안드로이드 응용 프로그램을 개발 중이다. 서비스는 일정한 간격마다 일정한 코드를 실행하고 그 결과를 활동에 종결시킬 것이다. 활동은 결과를 사용자에게 보여줘야한다.안드로이드 서비스에서 스레드/타이머를 사용하고 UI를 업데이트하는 방법은 무엇입니까?

먼저 스레드로 시도해 보았습니다. 고정 된 간격 후에 서비스가 실행되도록하려면 스레드를 생성합니다 - 코드를 실행하고 결과를 얻으십시오 - 표시를 위해이 결과를 활동으로 보내십시오 - 스레드를 일정 시간 동안 잠자기 상태로 만듭니다. 그러나 예상대로 작동하지 않습니다. 코드는 스레드에 의해 실행됩니다. 스레드가 절전 모드로 전환 된 후 잠자기 시간이 지난 후 결과가 활동의 끝에 보내집니다. 요구 사항은 스레드 코드 실행으로 결과를 얻은 후에 UI를 즉시 업데이트해야한다는 것입니다.

또한 Timer 및 TimerTask를 사용해 보았습니다. 그러나 위와 같은 결과를줍니다. 도와주세요.

서비스 클래스

@Override 
public int onStartCommand(Intent intent, int flags, int startId) 
{ 
    td = new ThreadDemo(); 
    td.start(); 
} 
private class ThreadDemo extends Thread 
{ 
    @Override 
     public void run() 
     { 
      super.run(); 
      String result = //code executes here and returns a result 
      sendMessageToUI(result); //method that will send result to Activity 
      ThreadDemo.sleep(5000); 
     } 
} 

private void sendMessageToUI(String strMessage) 
{ 
    Bundle b = new Bundle(); 
    b.putString(“msg”, strMessage); 
    Message msg = Message.obtain(null, 13); 
    msg.setData(b); 
} 

활동 클래스

public class MyActivity extends Activity 
{ 
    @Override 
    public void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
    } 
    class IncomingHandler extends Handler 
    { 
     @Override 
     public void handleMessage(Message msg) 
     { 
      System.out.println("in ui got a msg................"); 
      switch (msg.what) 
      { 
       case 13: 
        System.out.println("setting status msg.............."); 
        String str1 = msg.getData().getString("msg"); 
        textview.setText(str1); 
        break;  
      } 
     } 
    } 
} 
+0

처리기가 필요 없습니다. 'runOnUiThread' 사용 – Shafi

답변

0

방송 수신기는 경우에 사용하는 것이 훨씬 낫다.

활동에 등록하고 실행 목표

0

사용 LocalBroadcastManager에서 방송을 보낼 수 있습니다. 귀하의 서비스는 지역 방송을 만들고 귀하의 신청서에 제공 될 것입니다. 해당 알림에 대한 적절한 처리기를 응용 프로그램에 작성하고 이에 따라 사용자 인터페이스를 업데이트 할 수 있습니다.

응용 프로그램에서

Intent i = new Intent("NotificationServiceUpdate"); 
     LocalBroadcastManager.getInstance(this).sendBroadcast(i); 

서비스에 다음 코드를 넣어, 당신은 이제 당신의 활동이 통지를 받게됩니다

 LocalBroadcastManager.getInstance(this).registerReceiver(
       mMessageReceiver, new IntentFilter("NotificationServiceUpdate")); 

를 업데이트 할 활동에 다음을 넣어 때마다 서비스 작업 완료를 브로드 캐스트합니다. 이 브로드 캐스트를 응용 프로그램에 대해 비공개로 설정할 수 있습니다.

+0

빠른 답장을 보내 주셔서 감사합니다. 그러나 LocalBroadcastManager에는 더 높은 API 레벨이 필요합니다. 그리고 2.3.3을 사용하는 것이 요구됩니다. 나는 안드로이드 스레드의 동작을 아는 데 관심이 있습니다. 예상대로 작동하지 않는 이유는 무엇입니까? UI를 업데이트 한 다음 잠자기합니다. 감사. – ShwetaK

관련 문제