簡體   English   中英

Android-確定線程何時完成執行

[英]Android - determining when a thread has finished executing

我有點束縛。 我正在使用帶有進度對話框的應用程序來更新其值。 我按照本教程講解如何制作一個,最終得到了以下代碼:

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線程,但這是徒勞的。

您可能現在知道,您實際上無法在非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。

@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);
    });
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM