42

Runnable をバックグラウンド スレッドで実行したいと考えています。遅延に便利なのでHandlerを使いたい。つまり、

handler.post(runnable, delay);

runnableをバックグラウンドスレッドで実行する必要がある場所。そのようなハンドラを作成することは可能ですか? 「バックグラウンド」ルーパーはどこかにありますか、またはどのように作成できますか?

PSカスタムクラス extends Thread でそれを行う方法は知っていますが、ハンドラーの方法で行うよりもコーディングの労力が少し必要です。したがって、他のソリューションなどを投稿しないでください

handler.post(new Runnable() {
    @Override
    public void run() {
        new Thread() {
            @Override
            public void run() {
                //action
            }
        }.start();
    }
});

Handler が「クリーンな」方法でそれを行うことができるかどうか、私はさまよいます。

4

5 に答える 5

80

これを簡単に行うことができます:

private Handler mHandler;

private HandlerThread mHandlerThread;

public void startHandlerThread(){
    mHandlerThread = new HandlerThread("HandlerThread");
    mHandlerThread.start();
    mHandler = new Handler(mHandlerThread.getLooper());
}

次に、次のように呼び出します。

mHandler.postDelayed(new Runnable() {
        @Override
        public void run() {
          // Your task goes here
        }
    },1000);
于 2015-04-01T11:31:34.053 に答える
5

Looper.prepare()とを使用して、バックグラウンド スレッドでルーパーを設定できますLooper.loop

于 2013-09-09T09:09:23.660 に答える
0

Kotlin のバックグラウンド スレッドでタスクを実行する簡単な方法を実装しました。

fun background(function: () -> Unit) = handler.post(function)

private val handler: Handler by lazy { Handler(handlerThread.looper) }

private val handlerThread: HandlerThread by lazy {
    HandlerThread("RenetikBackgroundThread").apply {
        setUncaughtExceptionHandler { _, e -> later { throw RuntimeException(e) } }
        start()
    }
}

一般的な考え方は、タスクは簡単に実行でき、次々と順次実行され、キャッチされない例外はメインスレッドに伝播されるため、失われることはありません。関数以降は、基本的にメインスレッドで実行されるハンドラーです。

したがって、次のように簡単にタスクを投稿できます。

 background {
    some task to do in background...  
 }

いくつかのコーデ

 background {
    other task to do in background...  
    later {
        on main thread when all tasks are finished...
    }
 }
于 2020-06-13T20:17:19.467 に答える
0

の意味がわかりませんHandler

キューで実行するプロセスに供給されるスレッドが必要なようです。ここExecutorでsを調査することはおそらく有益ですが、キューを介して通信する単純な 2 つのスレッドのペアを次に示します。

public class TwoThreads {
  public static void main(String args[]) throws InterruptedException {
    System.out.println("TwoThreads:Test");
    new TwoThreads().test();
  }
  // The end of the list.
  private static final Integer End = -1;

  static class Producer implements Runnable {
    final Queue<Integer> queue;

    public Producer(Queue<Integer> queue) {
      this.queue = queue;
    }

    @Override
    public void run() {
      try {
        for (int i = 0; i < 1000; i++) {
          queue.add(i);
          Thread.sleep(1);
        }
        // Finish the queue.
        queue.add(End);
      } catch (InterruptedException ex) {
        // Just exit.
      }
    }
  }

  static class Consumer implements Runnable {
    final Queue<Integer> queue;

    public Consumer(Queue<Integer> queue) {
      this.queue = queue;
    }

    @Override
    public void run() {
      boolean ended = false;
      while (!ended) {
        Integer i = queue.poll();
        if (i != null) {
          ended = i == End;
          System.out.println(i);
        }
      }
    }
  }

  public void test() throws InterruptedException {
    Queue<Integer> queue = new LinkedBlockingQueue<>();
    Thread pt = new Thread(new Producer(queue));
    Thread ct = new Thread(new Consumer(queue));
    // Start it all going.
    pt.start();
    ct.start();
    // Wait for it to finish.
    pt.join();
    ct.join();
  }
}
于 2013-09-09T09:07:12.497 に答える