3

私は使用していましたが、この質問のために検討する価値のない理由でAsyncTask、従来の使用に切り替えました。Thread

onPre/PostExecute の機能と同様に、スレッドの開始前後に何かを実行するにはどうすればよいですか?

たとえば、スレッドの開始前にロード サークルを表示し、スレッドが終了したら閉じるとします。どうすればいいですか?

実行後のビットについては、thread.join() を使用していますが、うまくいくようです。それがそれを行う方法なのか、それとも実行前に何かを行う方法なのかはわかりません。

4

2 に答える 2

4

onPre/PostExecute の機能と同様に、スレッドの開始前後に何かを実行するにはどうすればよいですか?

onPreExecute()start()-> を呼び出す前に実行するステートメントThread

onPostExecute()->メイン アプリケーション スレッドで実行される を指定して、からrunOnUiThread()、またはpost()を呼び出します。ViewThreadRunnable

どうすればいいですか?

理想的には、そうしないでしょう。進行状況ダイアログは最悪です。UI のどこかに進行状況インジケーター (アクション バー、タイトル バーなど) を配置し、スレッドの動作中にユーザーが安全に実行できないいくつかのことを無効にします。

そうは言っても、おそらくDialogFragmentスレッドを実行する前に表示し、上記のメカニズムを介してスレッドが完了したらフラグメントを削除します。

実行後のビットについては、thread.join() を使用していますが、うまくいくようです。

イク。それはあなたがいるスレッドをブロックします。それがメインのアプリケーションスレッドである場合、それは本当に悪いことです。


アップデート

の例runOnUiThread():

new Thread() {
  public void run() {
    // do cool stuff
    runOnUiThread(new Runnable() {
      public void run() {
        // do other cool stuff quickly on the main application thread
      }
    );
  }
}).start();
于 2012-10-15T22:13:59.117 に答える
0

ラッチ (CountDownLatch など) は、別の便利な方法かもしれません。

public class TestHarness {
public long timeTasks(int nThreads, final Runnable task)
        throws InterruptedException {
    final CountDownLatch startGate = new CountDownLatch(1);
    final CountDownLatch endGate = new CountDownLatch(nThreads);

    for (int i = 0; i < nThreads; i++) {
        Thread t = new Thread() {
            public void run() {
                try {
                    startGate.await();
                    try {
                        task.run();
                    } finally {
                        endGate.countDown();
                    }
                } catch (InterruptedException ignored) { }
            }
        };
        t.start();
    }

    long start = System.nanoTime();
    startGate.countDown();
    endGate.await();
    long end = System.nanoTime();
    return end-start;
}

}

于 2012-10-16T06:01:27.630 に答える