バックグラウンドスレッドでRunnableを実行したい。ハンドラーを使用したいのは、遅延に便利だからです。私が意味するのは
handler.post(runnable, delay);
runnableはbackgroundスレッドで実行する必要があります。そのようなハンドラーを作成することは可能ですか?どこに「バックグラウンド」ルーパーがありますか、またはどのように作成できますか?
追伸私はカスタムクラスでそれを行う方法を知っていますが、スレッドを拡張しますが、ハンドラーの方法よりも少しコーディングの努力が必要です。そのため、他の解決策などを投稿しないでください
handler.post(new Runnable() {
@Override
public void run() {
new Thread() {
@Override
public void run() {
//action
}
}.start();
}
});
ハンドラーがそれを「クリーン」な方法で実行できるかどうか、私はたださまようだけです。
これを簡単に行うことができます:
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);
このようなものを試すことができます
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();
}
Looper.prepare()
およびLooper.loop
を使用して、バックグラウンドスレッドでルーパーを設定できます。
Handler
の意味がわかりません。
キューで実行するプロセスにフィードされるスレッドが必要なようです。おそらくExecutor
s 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();
}
}