2

我正在HandlerThreadAndroid 上进行试验,但我似乎无法解释一个奇怪的行为。这是我用来通过这个独特线程简单地记录消息的类。

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。

4

0 回答 0