我有一個耗時的任務(迭代通過文件和發送它的內容到服務器),我想執行在後臺線程,在特定interwal(這就是爲什麼我想使用處理程序)。困惑與線程 - 處理程序塊UI線程
從UI線程我有這樣一個電話:
LogsManager lm;
lm = new LogsManager(this);
lm.processLogFiles();
而在LogsManager
類我有下面這段代碼:
public void processLogFiles(){
Handler mHandler = new Handler();
mHandler.postDelayed(logsRunable, 1000);
}
private Runnable logsRunable = new Runnable() {
@Override
public void run() {
File f = new File(Environment.getExternalStorageDirectory()+Constants.LOG_DIR);
File[] logFiles = f.listFiles();
for (int i = 0; i < logFiles.length; i++) {
readLogs(logFiles[i]); // executes some other methods inside
}
}
};
正如你可以看到它只是法Handler
調用Runnable
。而且,不幸的是,它也阻止了我的UI線程。是不是Handler
應該爲Runnable
啓動一個新線程?我也在我的應用程序的其他部分使用處理程序,並且它們工作得很好。我做錯了什麼?
所以,基本上我必須爲Handler創建帶runnable的線程? – Sver
@Sver我認爲你並不需要'Handler'。您可以創建單個線程或更好地使用http://download.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/ScheduledExecutorService.html來完成工作 –
謝謝! ScheduledExecutorService工作正常,並且更易於理解。 – Sver