2012-10-16 37 views
0

我正在開發一個將啓動服務的android應用程序。服務將在每個固定時間間隔後執行一些代碼,並將結果結束到活動。活動應將結果顯示給用戶。如何在Android服務和更新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); 
} 

Activity類

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。我有興趣瞭解Android線程的行爲。爲什麼它不按預期工作?即更新UI然後睡眠。謝謝。 – ShwetaK