2016-07-22 58 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); 
    }); 
}