2012-07-13 88 views
1

我有一個異步作業是從一個按鈕點擊偵聽器啓動的。這是一項打印工作,所以它會在一天中一次又一次地發生。我想確保打印作業之間不會泄露任何線索或物體。我的looper.mylooper.quit()行是我需要的嗎?如何殺死looper/runnable

監聽器代碼:

private final Button.OnClickListener cmdPrintOnClickListener = new Button.OnClickListener() { 

    public void onClick(View v) { 
     enableScreenForUse(false); 
     setStatus("Saving any changes"); 
     saveButtonClicked(); 
     TwoInchZebraDocket newDocket = new TwoInchZebraDocket(mRunDetailID, getContentResolver()); //could set this to final if we get problems -> see for details http://stackoverflow.com/questions/11424924/how-can-i-pass-an-object-to-a-new-thread-generated-anonymously-in-a-button-liste/11425012?iemail=1#11425012 
     setStatus("Creating docket for printing"); 
     PrintRunnable target = new PrintRunnable(newDocket, CheckoutActivity.this); 
     new Thread(target).start(); 

     } 
}; 

的Runnable對象的代碼是:

public void run() { 
    Looper.prepare(); 
    printDocket(); 
    Looper.loop(); 
    Looper.myLooper().quit(); 

} 

回答

0

我覺得要你想要的是的AsyncTask。如果「printDocket()」正在更新你的UI線程,你將不得不引用不合適的活套。

這裏是開發文檔:http://developer.android.com/reference/android/os/AsyncTask.html

基本上,內doInBackground()做異步線程的工作,並在onPostExecute UI更新()。

+0

我嘗試了兩種方式 - 但無論哪種方式,我必須有一個looper.prepare(),否則與移動打印機的藍牙連接失敗。無論哪種方式,我仍然需要知道是否有任何泄漏。 – WaterBoy 2012-07-13 04:56:10