web-dev-qa-db-ja.com

バックグラウンドスレッドでハンドラーメッセージを実行する

バックグラウンドスレッドでRunnableを実行したい。ハンドラーを使用したいのは、遅延に便利だからです。私が意味するのは

handler.post(runnable, delay);

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

追伸私はカスタムクラスでそれを行う方法を知っていますが、スレッドを拡張しますが、ハンドラーの方法よりも少しコーディングの努力が必要です。そのため、他の解決策などを投稿しないでください

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

ハンドラーがそれを「クリーン」な方法で実行できるかどうか、私はたださまようだけです。

36

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

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);
68

このようなものを試すことができます

    private void createHandler() {
        Thread thread = new Thread() {
            public void run() {
                Looper.prepare();

                final Handler handler = new Handler();
                handler.postDelayed(new Runnable() {
                    @Override
                    public void run() {
                       // Do Work
                        handler.removeCallbacks(this);
                        Looper.myLooper().quit();
                   }
                }, 2000);

                Looper.loop();
            }
        };
        thread.start();
    }
8
Ayman Mahgoub

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

5
Yuichi Araki

Handlerの意味がわかりません。

キューで実行するプロセスにフィードされるスレッドが必要なようです。おそらくExecutors here を調査することから恩恵を受けるでしょうが、これはキューを介して通信する単純な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();
  }
}
0
OldCurmudgeon