3

当应用程序处于空闲模式时,我正在使用 MonoDroidLooper.MyQueue().AddIdleHandler()执行一些命令。这适用于一个活动,但如果我开始第二个活动,它会挂起,直到我触摸屏幕或重新启动第一个活动。没有循环或任何可能阻塞第二个活动中的队列的东西。如何防止弯针挂起?

Looper.MyQueue().AddIdleHandler(new ExecuteRunner(appState));
public class ExecuteRunner : Java.Lang.Object, MessageQueue.IIdleHandler
{
    int count = 0;
    ApplicationState appState;
    public ExecuteRunner(ApplicationState pAppState)
    {
        appState = pAppState;
    }

    public bool QueueIdle()
    {
        appState.YooManager.Manager.ExecuteCommand();
        count++;
        Android.Util.Log.Debug("YooBik-Exe", count.ToString());
        return true;
    }
}

消息队列会被什么东西阻塞吗?在空闲处理程序不工作的活动中,注册了 OnTouch 事件。

或者有人知道如何为 monodroid 实现空闲处理程序的另一种方法吗?

4

2 回答 2

1

如果它挂起直到您触摸屏幕,我猜它会等待 MessageQueue.next() (行 this.wait(); )。因为您的主要活动 looper.loop() 调用 MessageQueue.next() 以及它的作用:while(ture) { 1. pullNextLocked() 并在有一些 msg 执行时返回。否则: 2. 执行所有 queueIdle()。然后 3. this.wait(); <------------ 这是它等待的地方。}

如果您按 touch 然后调用 MessageQueue.enqueueMessage(Message <-- touch msg ) 并执行 this.notify() ,这使第 3 点恢复生机,然后第 1 点和第 2 点(您的 queueIdle() 被执行)

要破解它,您可以从活动中向其发送一些无意义的消息,这将启动 MessageQueue.enqueueMessage 并且 MessageQueue.next() 循环将被唤醒。

最好的问候, Zbyszek

于 2011-11-24T05:25:17.027 回答
0

不确定它是否会导致您的问题,但您需要 ExecuteRunner 从 Java.Lang.Object 继承并删除您的 Handle 实现。当系统调用你的 Handle 方法时,它会抛出一个未处理的异常并导致你的线程/应用程序死掉。

于 2011-10-17T15:45:28.727 回答