2011-05-25 57 views
3

我試圖在指定的時間(即每隔幾秒鐘,雖然此速率可能會在運行時更改)異步並重復執行任務(即從文本文件加載數據)。如何實現一個執行AsyncTask的Timer/TimerTask? (Android)

我已經做了一些研究,並決定這將需要一個AsyncTask或一個單獨的線程。爲了簡單起見,我決定使用AsyncTask。

我現在需要根據重複計時器計劃執行此AsyncTask。我相信我必須使用Timer和TimerTask。

下面的代碼是我試圖實現的簡單形式。當我嘗試使用Android模擬器(通過Eclipse IDE)運行此代碼時,出現以下消息:「對不起!應用程序意外停止,請重試。」

我想知道問題出現在哪裏以及如何修復它。謝謝!

public class Sample extends Activity { 

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    SimpleTimerTask myTimerTask = new SimpleTimerTask(); 

    long delay = 0; 
    long period = 5000; 

    Timer myTimer = new Timer(); 
    myTimer.schedule(myTimerTask, delay, period); 
} 


private class SimpleAsyncTask extends AsyncTask<Void, Void, Void> { 
    protected Void doInBackground(Void... params) { 
     return null; 
    } 
} 


private class SimpleTimerTask extends TimerTask { 
    public void run() { 
     new SimpleAsyncTask().execute(); 
    }  
} 

} 

編輯:這裏是logcat的消息,似乎是有關

致命異常:定時器0

java.lang.ExceptionInInitializerError

在...

由於:java.lang.RuntimeException:無法在未調用Looper.prepare()的線程中創建處理程序()

at ...

+1

logcat中的日誌說什麼?你可能會在那裏找到一個堆棧跟蹤,這表明你的問題。 – Kaj 2011-05-25 14:56:46

+0

@Kaj - 這是一個非常有用的評論(對於像我這樣的初學Android開發者至少)。我甚至不知道LogCat是什麼,但現在我看到它的調試/錯誤跟蹤的價值。 – 2011-05-31 19:07:13

回答

10

你正在使這種方式比它需要更難。 TimerTask已經在它自己的線程上運行,因此您不需要使用AsyncTask只需將要運行的代碼放在TimerTask.run()方法中即可。

+0

有趣。我更喜歡這個解決方案,因爲它更簡單。我只需要弄清楚如何從TimerTask線程更新UI ...任何想法?謝謝你的幫助! – 2011-05-25 15:34:55

+1

你可以傳入'Handler'來發送Messages到UI線程。 – CaseyB 2011-05-25 15:42:31

+0

再次感謝凱西,我有一個可行的解決方案。 – 2011-05-25 16:13:18

0

如果要從OnPostExecute方法更新UI,使用asyncTask的timertask存在嚴重的限制。一個計時器在單獨的線程中運行,所以你必須找到一種方法來從主線程啓動一個asynctask。