#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. Сделал это. Не исправил мою ошибку. Я никогда не получал исключения, поэтому подумал, что все в порядке.