2016-07-22 6 views
0

私はバインドされています。私はその値を更新するProgress Dialogをアプリケーションに書いています。私は1つを作る方法についてのチュートリアルを以下だったと私は、このコードになってしまった。今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のループの後で、UIのスレッドを更新するために関数onExecuteAfterを呼び出しようとしましたが、それは無駄でした。

ご協力いただきありがとうございます。

+1

*スレッドには停止する機能がないようです。*:メソッドの実行が終了すると実行が終了します。 *タスクが完了したときに外部関数を呼び出す*このようなことはありません。あなたはそれを自分で実装する必要があります。 – Blackbelt

+0

ui以外のスレッドからui上のコードを実行する場合は、activity.runOnUiThread()を使用してください – 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オブジェクトには、必要に応じてHandlerの代わりに使用できるPost(Runnable)メソッドがあることに注意してください。

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); 
    }); 
} 
関連する問題