Android - 确定线程何时完成执行

时间:2016-07-22 14:04:48

标签: android multithreading

我有点受约束。我正在编写一个带有Progress Dialog的应用程序来更新它的价值。我正在按照本教程学习如何制作一个,我最终得到了这段代码:

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函数不同,线程似乎没有一个函数来阻止自己并告诉你(一个覆盖或一个听众)它已经完成了执行。

有人知道如何知道线程何时停止执行其任务或在任务完成时调用外部函数?

我试图在onExecuteAfter循环之后调用函数while来更新我的UI线程,但那是徒劳的。

2 个答案:

答案 0 :(得分: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。 / p>

答案 1 :(得分: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);
    });
}