Приложение Xamarin Forms Android выдает всплывающее окно ANR через 90 секунд - PullRequest
2 голосов
/ 26 мая 2020

Мы разработали приложение на Xamarin Forms. В приложении Android, когда пользователь использует приложение в слабой сети в течение примерно 90 секунд, мы получаем всплывающее окно «приложение не отвечает» (ANR). У меня вопрос: есть ли способ избежать появления этого всплывающего окна ANR в моем приложении? Другими словами, есть ли способ заставить систему android ждать более продолжительное время?

В нашем приложении, когда пользователь запускает приложение, мы выполняем несколько задач в потоках, которые в основном выполняются на вторичном сервере. такие темы, как:

  • Инициализация карты Google, создание выводов и рисование полилинии

  • Регистр прослушивателя Firebase

  • REST API вызывает

  • Загрузка элементов списка

Итак, перед тем, как устройство завершит вышеуказанный список задач, если пользователи продолжат касаться экран, то это приводит к тому, что несколько событий помещаются в очередь в основном потоке, из-за чего мы получаем ANR (приложение не отвечает всплывающее окно).

Здесь мы намерены отключить событие касания, пока не завершим основной поток в существующей задаче.

1 Ответ

1 голос
/ 27 мая 2020

Вы можете использовать лог c ниже, чтобы ограничить касания к содержимому страницы под индикатором активности, чтобы решить вашу проблему.

Тем не менее, касания для сетки ниже будут прослушивается системой Android и будет обработано. Здесь вы можете ограничить взаимодействие только представлениями вашего приложения. Однако прикосновение, полученное системой Android для Grid, ContentView или ActivityIndicator в приведенном ниже коде, никогда не может быть проигнорировано.

В идеале ни один пользователь не будет пытаться коснуться больше раз после того, как осознает, что нет взаимодействия, когда загрузчик загружается. Так что я думаю, вы можете спокойно игнорировать этот случай, учитывая общий процесс мышления пользователя.

<Grid Grid.RowSpan="2" 
        InputTransparent="{Binding IsPageInteractable}" 
        IsVisible="{Binding IsPageBusy}">
    <ContentView Opacity="0.2" 
                    BackgroundColor="#4B4B4B" 
                    VerticalOptions="FillAndExpand" 
                    HorizontalOptions="FillAndExpand" />
    <ActivityIndicator IsRunning="{Binding IsPageBusy}" 
                        HorizontalOptions="CenterAndExpand" 
                        VerticalOptions="CenterAndExpand" />
</Grid>
public bool IsPageInteractable
{
    get { return _isPageInteractable; }
    set { _isPageInteractable = value; }
}

public bool IsPageBusy
{
    get { return _isPageBusy; }
    set
    {
        _isPageBusy = value;
        this.IsPageInteractable = !value;
    }
}
...