【问题标题】:handler.sendMessage() is not reaching the handleMessage() in androidhandler.sendMessage() 没有到达 android 中的 handleMessage()
【发布时间】:2015-02-12 06:55:55
【问题描述】:

我已经创建了处理程序,

    public final Handler handlerPositionTest = new Handler() {
        public void handleMessage(Message msg) {
         Log.i(TAG, "handleMessage------------reached");
          //MyCode here
        }
    };

我还有一个通用事件侦听器来接收事件详细信息,

private GenericEventListener PositionStatusChangedListener = new GenericEventListener() {
            public void eventTriggered(Object sender, Event event) {
            Log.i(TAG, "Event triggered here------------");
            Log.i(TAG, "Event is not null------------:"+event);
            Log.i(TAG, "hanlder------------:"+handlerPositionTest);
            Message msg = handlerPositionTest.obtainMessage();
            msg.what = 2;
            msg.obj = e;
            handlerPositionTest.sendMessage(msg);
}
};

如果我连续触发事件,则 sendMessage() 方法在几秒钟内无法到达处理程序中的 handleMessage() 方法。它丢失了该事件消息好吧。如果我在几秒钟后尝试它可以正常工作,我的意思是它正在到达 handleMessage()

我不清楚重现此问题的方案。它是随机发生的。

如果你们对这个问题有任何想法,请留下评论。

提前致谢。

【问题讨论】:

  • 我没有看到任何代码将处理程序启动到另一个线程。你在 UI 线程上做繁重的工作吗?
  • 是的,我知道这可能会导致繁重的工作。但是和我现在的东西有关系吗?

标签: java android multithreading android-activity thread-safety


【解决方案1】:

如果您正在执行不及时返回的同步调用,您可能希望在后台线程上启动处理程序。

    HandlerThread handlerThread = new HandlerThread(
            "Background thread",
            android.os.Process.THREAD_PRIORITY_BACKGROUND
    );
    handlerThread.start();
    mHandler = new android.os.Handler(handlerThread.getLooper(), this);

只需确保将 UI 的所有更新放在 runOnUiThread(Runnable) 中即可

有关线程和进程的更多信息,我建议您查看Android developer guide to processes and threads

【讨论】:

  • @math...我对这个概念完全陌生。我应该尝试使用 eventTriggered() 方法来实现您的代码吗?
猜你喜欢
  • 2016-03-16
  • 1970-01-01
  • 2016-09-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-12
  • 1970-01-01
相关资源
最近更新 更多