从后台线程推送内容页冻结应用程序

时间:2017-08-15 15:38:58

标签: xamarin xamarin.ios xamarin.forms

在Xamarin Forms for iOS中,我有一个显示视频控件的ContentPage的自定义渲染器。在我的Xamarin Forms应用程序中,此自定义ContentPage显示在NavigationPage中。 当通过MQTT传入特定消息时,我想打开视频屏幕。

当我通过单击主屏幕上的链接打开视频页面时,它会按预期打开。我知道我通过MQTT接收消息并因控制台语句和断点而调用Navigation.PushModalAsync()。但是,在调用PushModalAsync后,每次都不会显示自定义呈现的页面,并且我的应用程序的UI会冻结。

基于在我的应用程序后台接收MQTT通知,我还需要做些什么来触发Navigation.PushModalAsync()吗?

ViewRoomsPage.axml.cs:

[XamlCompilation(XamlCompilationOptions.Compile)]
public partial class ViewRoomsPage : ContentPage
{
    public ViewRoomsPage()
    {
        InitializeComponent();
    }

    public string StreamUri { get; set; }
}

ViewRoomsPage.axml:

<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
         xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
         x:Class="MyForms.Pages.ViewRoomsPage">
<ContentPage.Content>
</ContentPage.Content>

VideoViewerRenderer.cs(删除了视频代码;这应该显示一个空白的红色屏幕。当从主屏幕上的按钮启动时它也有效)

[assembly: ExportRenderer(typeof(ViewRoomsPage), typeof(ViewRoomsRenderer))]
namespace MyForms.IOS.NativeImplementations
{
    public class ViewRoomsRenderer : PageRenderer
    {
        private IJKFFMoviePlayerController _playerController;

        protected override void OnElementChanged(VisualElementChangedEventArgs e)
        {

            base.OnElementChanged(e);

            if (e.OldElement != null || Element == null)
            {
                return;
            }

            e.NewElement.BackgroundColor = Color.Red;
        }
    }
}

从接收MQTT消息触发的方法

    public void PushViewRooms()
    {
        Device.BeginInvokeOnMainThread(async () =>
        {
            await Application.Current.MainPage.Navigation.PushModalAsync(new ViewRoomsPage());
        });
    }

在App.xaml.cs中:

public partial class App : Application
{
    public App()
    {
        SetupDependencies(); // using StructureMap
        Manager = DependencyContainer.Resolve<IMqttManager>();
        Manager.Connect();            

        InitializeComponent();

        var mainPage = new MainPage();
        MainPage = new NavigationPage(mainPage);
    }
}

1 个答案:

答案 0 :(得分:0)

问题是由在后台运行的另一部分代码中触发Task.WaitAll()导致的死锁。

感谢所有帮助理智的人检查它是否与渲染器的设置方式不同。