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