Android HandlerThread:Handler post有时不运行Runnable

时间:2016-02-28 20:09:04

标签: java android android-handler android-handlerthread

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

0 个答案:

没有答案