PulltoRefresh +等待FadeTo + TranslateTo动画组合Crash on Xamarin.forms

时间:2016-10-14 20:41:04

标签: xamarin xamarin.ios async-await xamarin.forms

我正在使用Xamarin.forms PCL制作应用程序。

我真的很难解决这个问题。 我花了好几天但却无法解决。

我正在使用这个nuget

当我同时使用它并在页面上添加一些动画时。 当我尝试刷新时,它会给出此运行时异常。 (这种情况非常罕见,如10次一次)

  • 崩溃只发生在iOS上。
  • 这是非常罕见的。您可以尝试刷新10次以上。你会看到。
  • 它只发生在实际的iOS设备上。
  

Foundation.MonoTouchException:抛出Objective-C异常。名称:   NSGenericException原因:***集合< __ NSSetM:0x14feb8b0>是   在被枚举时发生变异。

我很清楚这是什么以及何时发生。 当我尝试访问列表或不同线程上的已删除项目时会发生这种情况。

所以我制作了非常简单的源代码来简单地查看这个问题。 我的代码中没有任何列表或数组。 好吧,它再次发生。

https://github.com/myallb/test_pulltorefresh

这是我重现此问题的示例源代码。如果您能帮助我,请查看此代码。

  • 崩溃只发生在iOS上。
  • 这是非常罕见的。您可以尝试刷新10次以上。你会看到。
  • 它只发生在实际的iOS设备上。

非常感谢。

  • 完整源代码

    使用Xamarin.Forms;     使用Plugin.BLE.Abstractions.Contracts;     使用Plugin.BLE;     使用Plugin.BLE.Abstractions.EventArgs;     使用系统;     使用System.Diagnostics;     使用Refractored.XamForms.PullToRefresh;     使用System.Threading.Tasks;

    namespace test
    {
        public partial class testPage : ContentPage
        {
            public static IAdapter Adapter { set; get; }
    
            public PullToRefreshLayout RefreshView = null;
            AbsoluteLayout layout;
    
            public testPage()
            {
                InitializeComponent();
    
                Adapter = CrossBluetoothLE.Current.Adapter;
    
                if (Adapter != null)
                {
                    Adapter.DeviceAdvertised += OnEvent_DeviceAdvertised;
                    Adapter.DeviceConnected += OnEvent_DeviceConnected;
                    Adapter.DeviceConnectionLost += OnEvent_DeviceConnectionLost;
                    Adapter.DeviceDisconnected += OnEvent_DeviceDisconnected;
                    Adapter.DeviceDiscovered += OnEvent_DeviceDiscovered;
    
                    Device.StartTimer(TimeSpan.FromSeconds(5), Timer_ScanDevice);
                }
                else {
    
                }
    
                layout = new AbsoluteLayout()
                {
                    BackgroundColor = Color.Purple,
                };
    
                ScrollView scrollview = new ScrollView()
                {
                    VerticalOptions = LayoutOptions.FillAndExpand,
                    HorizontalOptions = LayoutOptions.FillAndExpand,
                    Content = layout
                };
    
                RefreshView = new PullToRefreshLayout
                {
                    VerticalOptions = LayoutOptions.FillAndExpand,
                    HorizontalOptions = LayoutOptions.FillAndExpand,
                    Content = scrollview,
                    RefreshColor = Color.Red,
                    RefreshCommand = new Command(RefreshStart)
                };
                RefreshView.IsPullToRefreshEnabled = true;
    
                Content = RefreshView;
    
                Device.StartTimer(new TimeSpan(0, 0, 1), ani);
            }
    
    
            bool ani()
            {
                Label z = new Label()
                {
                    Text = "Z",
                    TextColor = Color.White,
                    FontAttributes = FontAttributes.Bold,
                    FontSize = new Random().Next(22, 35)
                };
    
                AbsoluteLayout.SetLayoutBounds(z, new Rectangle(0.67 + new Random().Next(0, 10) / 100.0, 0.13 + new Random().Next(0, 10) / 100.0, 40, 40));
                AbsoluteLayout.SetLayoutFlags(z, AbsoluteLayoutFlags.PositionProportional);
                layout.Children.Add(z);
    
                Device.BeginInvokeOnMainThread(async () =>
                {
                    Task t1 = z.FadeTo(0, 3500);
                    Task t2 = z.TranslateTo(0, -70, 3500, Easing.SinInOut);
    
                    await Task.WhenAll(t1, t2);
                    layout.Children.Remove(z);
                });
    
                return true;
            }
    
            void RefreshStart()
            {
                Debug.WriteLine("RefreshStart");
    
                if (RefreshView != null)
                    RefreshView.IsRefreshing = true;
    
                Device.BeginInvokeOnMainThread(async () =>
                {
                    await Task.Delay(20);
    
                    Debug.WriteLine("RefreshEnd");
                    RefreshView.IsRefreshing = false;
                });
            }
    
            bool Timer_ScanDevice()
            {
                Adapter.StartScanningForDevicesAsync();
    
                return true;
            }
    
    
            void OnEvent_DeviceAdvertised(object sender, DeviceEventArgs a)
            {
                Debug.WriteLine("OnEvent_DeviceAdvertised");
            }
    
            void OnEvent_DeviceDiscovered(object sender, DeviceEventArgs a)
            {
                Debug.WriteLine("OnEvent_DeviceDiscovered");
            }
    
            void OnEvent_DeviceConnected(object sender, DeviceEventArgs a)
            {
                Debug.WriteLine("OnEvent_DeviceConnected");
            }
    
            void OnDeviceProcessError(IDevice device, string message)
            {
                Debug.WriteLine("OnDeviceProcessError");
            }
    
            void OnEvent_DeviceConnectionLost(object sender, DeviceErrorEventArgs a)
            {
                Debug.WriteLine("OnEvent_DeviceConnectionLost");
            }
    
            void OnEvent_DeviceDisconnected(object sender, DeviceEventArgs a)
            {
                Debug.WriteLine("OnEvent_DeviceDisconnected");
            }
        }
    }
    

0 个答案:

没有答案