我正在Android上试验HandlerThread
,而我似乎无法解释一个奇怪的行为。这是我用来简单地通过这个独特的线程记录消息的类。
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。