MonoDroid Looper.MyQueue () зависает на некоторых действиях / Idle Handler? - PullRequest
3 голосов
/ 17 октября 2011

Я использую MonoDroid Looper.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.

Или кто-нибудь знает другой способ реализации обработчика простоя для монодроида?

Ответы [ 2 ]

1 голос
/ 24 ноября 2011

Если он зависает до тех пор, пока вы не коснетесь экрана, я думаю, что он ожидает MessageQueue.next () (строка this.wait ();). Потому что ваша основная деятельность looper.loop () вызывает MessageQueue.next () и что он делает: while (ture) { 1. pullNextLocked () и возвращает, если есть какое-то сообщение для выполнения. иначе : 2. выполнить все queueIdle (). а потом 3. this.wait (); <---------- это где ждать. } </p>

Если вы нажмете touch, тогда MessageQueue.enqueueMessage (Message <- touch msg) вызывается и выполняет this.notify (), который возвращает пункт 3 к жизни, а затем пункт 1 и 2 (ваш queueIdle () выполнено) </p>

Чтобы взломать его, вы можете отправить ему какое-то бессмысленное сообщение из вида деятельности, которое будет запускать MessageQueue.enqueueMessage, и будет пробужден цикл MessageQueue.next ().

С уважением, Збышек

0 голосов
/ 17 октября 2011

Не уверен, вызывает ли это вашу проблему или нет, но вам нужно ExecuteRunner для наследования от Java.Lang.Object и удаления вашей реализации Handle.Когда система вызывает ваш метод Handle, он генерирует необработанное исключение и приводит к смерти вашего потока / приложения.

...