2016-07-22 91 views
0

我處於一種綁定狀態。我正在編寫一個具有更新其值的進度對話框的應用程序。我下面就如何使一個本教程中,我結束了這段代碼:Android - 確定線程執行完成時的狀態

progress = new ProgressDialog(this); 
progress.setMessage("Scanning for Devices"); 
progress.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); 
progress.setIndeterminate(true); 
progress.setProgress(0); 
progress.show(); 

final int totalProgressTime = 100; 
final Thread t = new Thread() { 
    @Override 
    public void run() { 
     int jumpTime = 0; 
     BTAdapter.startDiscovery(); 

     while(jumpTime < totalProgressTime) { 
      try { 
       sleep(250); 
       jumpTime += 5; 
       progress.setProgress(jumpTime); 
      } 
      catch (InterruptedException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
     } 
    } 
}; 
t.start(); 

但是現在,當進度達到100時,while()循環不再執行,現在我不能完全編程,如果知道進展是否完成。代碼方面,線程將運行直到進度達到100爲止。與異步任務中我有一個postExecute函數不同,線程似乎沒有一個函數來停止自己並告訴你(一個覆蓋或一個監聽器)它是完成執行。

有誰知道如何知道線程何時停止執行其任務或在任務完成時調用外部函數?

我試圖在while循環後調用函數onExecuteAfter來更新我的UI線程,但這是徒勞的。

任何幫助,非常感謝。

+1

*線程似乎沒有停止的函數*:執行以方法運行結束。 *或在任務完成時調用外部函數*沒有這樣的事情。你必須自己實現它。 – Blackbelt

+0

使用activity.runOnUiThread()如果你想在非UI線程上執行ui上的代碼 – Ramin

+0

Rxjava可能會觸及你的請求 – Harlan

回答

1

正如你現在可能知道的,你不能在非UI線程中真正做UI工作。

在這些情況下,通常的做法是使用上下文或處理後一個Runnable,當線程完成:

// Created in UI thread as a local instance variable in 
    // the Fragment or Activity 
    Handler mHandler = new Handler(); 

    .... 

    @Override 
    public void run() { 
     .... 
     while(...) { 
      ....stuff... 
     } 
     mHandler.post(new Runnable() { 
      @Override 
      void run() { 
       ... do something useful in the UI thread ... 
      } 
     }); 
    } 

如果你願意,你可以讓Runnable的本地成員在主機片段或活動,並記住所有View對象都有一個Post(Runnable)方法,您可以使用它來代替Handler,如果這符合您的需要。

0
@Override 
public void run() { 
    // Handle 'doInBackground' work here 
    while(jumpTime < totalProgressTime) { 
     try { 
      sleep(250); 
      jumpTime += 5; 
      progress.setProgress(jumpTime); 
     } 
     catch (InterruptedException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 

    // Handle 'postExecute' work here. 
    doUiWork(); 
} 

private void doUiWork() { 
    runOnUiThread(new Runnable() { 
     progress.setVisibility(View.GONE); 
    }); 
}