2010-10-22 37 views
1

有人建議我使用此代碼,使我的方法的時候一定時間後執行的問題,我修改了一下,現在我有:與可運行

private Handler mHandler = new Handler(); 
private Runnable mUpdateTimeTask = new Runnable() { 
    public void run() { 
     final long start = mStartTime; 

     // Get the difference in ms 
     long millis = SystemClock.uptimeMillis() - start; 

     // Format to hours/minutes/seconds 
     int mTimeInSec = (int) (millis/1000); 

     // Do your thing 

     Location location = tracker.getLastKnownLocation(best); 
     RetrieveAvgPower(location); 

     // Update at the next second 
     mHandler.postAtTime(this, 1000);//start + ((mTimeInSec + 10) * 1000)); 
    } 
}; 

我嘗試啓動和停止它與:

public void onClick(View v) { 
     switch (v.getId()) { 
      case R.id.start: 
        mStartTime = System.currentTimeMillis(); 
        mHandler.removeCallbacks(mUpdateTimeTask); 
        mHandler.postDelayed(mUpdateTimeTask, 1000); 
        break; 
       case R.id.stop: 
        mHandler.removeCallbacks(mUpdateTimeTask); 
        break;}} 

但是,有一個問題。首先,我的方法設置文本並將一行寫入日誌文件,但如果我使用上面的代碼文本沒有被設置,但是所有信息都會自動寫入日誌文件。另一件事是我不能停止runnable - 它開始執行程序後似乎沒有響應和崩潰,如果我試圖按停止按鈕。我做錯了什麼以及如何解決?

+0

你應該使用asynctask – Falmarri 2010-10-22 17:35:19

回答

2
應該

run()呼叫Handler.postDelayed()而非Handler.postAtTime()的最後一行?

根據事件隊列在Android中的實現方式,您可能會通過使用錯誤的線程來殺死線程......您基本上一直將Runnable設置爲在線程最初啓動後的1秒內運行,因此沒有其他事件開始跑步。

1

要停止運行的,你可以只添加這樣的事情:

class A implements Runnable 
{ 
private volatile boolean runTask = false; 

public void run() 
{ 
    runTask = true; 
    while(runTask) 
    { 
     // Do your thing 
     Thread.sleep(1000); // wait 1 second before "Do your thing" again 
    } 
} 


public void stop() 
{ 
    runTask = false; 
} 


} 

至於沒有更新我不很明白的文字,是它在一個Swing GUI的未設置?

EDIT 在運行方法

EDIT的由對等端部添加了了Thread.sleep(1000): 移動Thread.sleep代碼(1000),使得,直到停止了Runnable將運行1次(而不是連續運行,然後在停止後等待1秒)。