MonoDroid Looper.myQueue () зависает на некоторых действиях / обработчике ожидания?

#android #xamarin.android #handler #looper

#Android #xamarin.android #обработчик #петлитель

Вопрос:

Я использую MonoDroid Looper.MyQueue().AddIdleHandler() для выполнения некоторых команд, когда приложение находится в режиме ожидания. Это работает в одном действии, но если я начинаю второе действие, оно зависает, пока я не коснусь экрана или не перезапущу первое действие. Нет цикла или чего-либо, что могло бы заблокировать очередь во втором действии. Как я могу предотвратить зависание looper?

 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?

Ответ №1:

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

Если вы нажмете touch, тогда MessageQueue.enqueueMessage(сообщение <— touch сообщение) вызывается и выполняет this.notify(), что возвращает к жизни пункт 3, а затем пункты 1 и 2 (выполняется ваш queueIdle() )

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

С наилучшими пожеланиями, Збышек

Ответ №2:

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

Комментарии:

1. Сделал это. Не исправил мою ошибку. Я никогда не получал исключения, поэтому подумал, что все в порядке.