私はHandlerThread
Android で実験していますが、奇妙な動作を説明できないようです。これは、この一意のスレッドを介してメッセージを単純にログに記録するために使用しているクラスです。
public class HandlerLogger {
MyHandler mHandler;
HandlerThread myThread;
private class MyHandler extends Handler {
public MyHandler(Looper myLooper) { super(myLooper); }
}
public HandlerLogger() {
myThread = new HandlerThread("my super thread");
myThread.start();
mHandler = new MyHandler(myThread.getLooper());
}
public void log(final String s) {
mHandler.post(new Runnable() {
@Override
public void run() { Log.d("handler", s); }
});
}
}
そして、これがこのクラスの私の使用法です:
HandlerLogger h = new HandlerLogger();
for (int i = 0; i < 1000; i++) {
h.log(String.valueOf(i));
}
ここで、奇妙な動作について説明します。これを何度も実行した後、ログが約 7xx または 8xx (特定の値ではない) で停止することがあり、ほとんどの場合は 999 になりますが、実際にはすべての投稿がそうではないように見えます。走る。どうしてこれなの?誰か説明してもらえますか?
精度: これらのテストには Genymotion エミュレーターを使用しています。
更新: 実際のデバイスで同じ動作 (Moto X 2012)
手がかりをありがとう。
解決済み: これが発生した理由は、Android の logcat が非常に多くのエントリの処理を処理できなかったため、単純にそれらの表示をスキップしたためです。Handler の runnable は実際には毎回実行され、次の方法で簡単に確認できます。
public class HandlerLogger {
MyHandler mHandler;
HandlerThread myThread;
int hitsCounter;
private class MyHandler extends Handler {
public MyHandler(Looper myLooper) { super(myLooper); }
}
public HandlerLogger() {
myThread = new HandlerThread("my super thread");
myThread.start();
mHandler = new MyHandler(myThread.getLooper());
}
public void log(final String s) {
mHandler.post(new Runnable() {
@Override
public void run() {
hitsCounter++;
Log.d("handler", s);
}
});
}
}
を確認するhitsCounter
と、実際には予想どおり 1000 に等しいことがわかります。