2011-07-27 33 views
0
的活動

我想開始一個活動後,纔有些數據是在服務準備 我有一個計時器任務想這裏面不斷地輪詢數據readness異常而起價TimerTask的

服務
public class SplashTask extends TimerTask { 
    @Override 
    public void run() { 
     Log.i(MY_DEBUG_TAG, "Internet is accessible, Running some Spalsh screen Tasks "); 
     if(mBoundService.isDataReady()) { 
      Log.e(MY_DEBUG_TAG, "Data is ready in service.."); 
      startActivityForResult(new Intent(SplashDroid.this, FunWithDataActivity.class), 3); 
     } else { 
      Log.e(MY_DEBUG_TAG, "Data not ready in service.."); 
     } 
     Log.i(MY_DEBUG_TAG, "Spalsh Tasks fnished.."); 
    } 
} 

問題是,當數據已準備就緒,FunWithDataActivity即將開始,我發現了以下錯誤

07-27 14:53:40.614: ERROR/AndroidRuntime(1042): java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare() 

回答

1

您不能從非UI線程使用startActivityForResult。您可以使用runOnUiThread()Handler.post()

此外,你不應該使用單獨的線程進行輪詢。使用HandlerpostDelayed()函數進行輪詢。這樣你就不會浪費整個線程進行簡單的輪詢。舉個例子看看:Repeat a task with a time delay?

+0

那個例子太神奇了.. –

3

startActivityForResult必須從UI線程(這不是執行處理程序的線程)調用。要實現此目的,請將startActivityForResult代碼移至Runnable,並在run()內使用runOnUiThread運行。

+0

是否有可能將'Timertask'與'runOnUiThread'結合? –

+0

我相信如此。這只是用'runOnUiThread(startRunnable)'調用來替換'run()'中的'startActivityForResult'調用,而在'startRunnable'對象的'run()'中,可以調用'startActivityForResult'。 – sparkymat

+0

@Mithun P,你不應該在你的情況下真的使用'TimerTask'進行輪詢,使用'Handler.postDelayed()'。這對於Activity組件來說是更健壯和更節約資源的方法。 – inazaruk