Xamarin形成Android应用程序,90秒后弹出ANR

Xamarin形成Android应用程序,90秒后弹出ANR,xamarin,xamarin.forms,xamarin.android,android-anr-dialog,Xamarin,Xamarin.forms,Xamarin.android,Android Anr Dialog,我们开发了一个Xamarin形式的应用程序。在Android应用程序中,当用户在低网络中使用应用程序约90秒时,我们会看到应用程序无响应(ANR)弹出窗口。我的问题是,有没有办法避免在我的应用程序中出现这个ANR弹出窗口?换句话说,有没有办法强迫android系统等待更长的时间 在我们的应用程序中,当用户启动应用程序时,我们在主要在辅助线程上运行的线程上执行多个任务,如: 初始化Google地图并创建接点和多段线图形 Firebase侦听器寄存器 RESTAPI调用 正在加载列表项 因此,在

我们开发了一个Xamarin形式的应用程序。在Android应用程序中,当用户在低网络中使用应用程序约90秒时,我们会看到应用程序无响应(ANR)弹出窗口。我的问题是,有没有办法避免在我的应用程序中出现这个ANR弹出窗口?换句话说,有没有办法强迫android系统等待更长的时间

在我们的应用程序中,当用户启动应用程序时,我们在主要在辅助线程上运行的线程上执行多个任务,如:

  • 初始化Google地图并创建接点和多段线图形

  • Firebase侦听器寄存器

  • RESTAPI调用

  • 正在加载列表项

因此,在设备完成上述任务列表之前,如果用户继续触摸屏幕,则会导致多个事件在主线程中排队,因此我们将获得ANR(应用程序无响应弹出窗口)


在这里,我们打算禁用触摸事件,直到完成现有任务中的主线程。

您可以使用以下逻辑将触摸限制在活动指示器下方的页面内容,以解决问题

不过,Android系统仍将收听下面网格的触摸,并对其进行处理。在这里,您只能将交互限制到应用程序视图。但是,在下面的代码中,Android系统对Grid、ContentView或ActivityIndicator的触摸是绝对不能忽略的

理想情况下,当加载程序加载时,用户意识到没有交互后,不会尝试触摸更多次。因此,考虑到用户的一般思维过程,我想您可以放心地忽略这个案例


您不能更改导致ANR出现的操作系统级触发器,但在开发周期中启用
StrictMode
(以及拉动ANR跟踪)等操作会将您的意图集中在编码错误的区域。我建议阅读谷歌的ANR文档:
<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;
    }
}