我正在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。