如何解决如果从MessagingCenter收到消息并随后更新UI,则应用程序不会第二次加载视图
我正在通过BroadcastReceiver
向共享项目中的多个视图发送意图。 DisplayResult
方法实现了MessagingCenter.Send
。
public class MyBroadcast : BroadcastReceiver
{
public override void OnReceive(Context context,Intent intent)
{
String action = intent.Action;
if (action.Equals(MainActivity.Instance.Resources.GetString(intentString)))
{
//Device.BeginInvokeOnMainThread(() => MainActivity.Instance.DisplayResult(intent));
//Task.Run(() => MainActivity.Instance.DisplayResult(intent));
//MainActivity.Instance.RunOnUiThread(() => MainActivity.Instance.DisplayResult(intent));
}
}
}
如果收到消息,我想更新我的视图,例如像这样:
MessagingCenter.Subscribe<object,Model>(this,"HI",(sender,arg) =>
{
var dt = DateTime.Now;
_logger.Debug($"Task started: {dt}");
ActivityIndicator.IsVisible = true;
ActivityIndicator.IsRunning = true;
Task.Run(async () =>
{
await SomeTask();
}).GetAwaiter().GetResult();
_logger.Debug($"Task finished: {DateTime.Now - dt}");
ActivityIndicator.IsRunning = false;
ActivityIndicator.IsVisible = false;
}
});
问题是,如果我在Task.Run(...)
中使用该方法,则我的视图仅在但运行ActivityIndicator
时显示。这意味着,如果我关闭一个视图并返回到MainPage并再次导航到另一个或相同的视图,它将仅显示白屏。
如果我使用Device.BeginInvokeOnMainThread(...)
或RunOnUiThread(...)
,我将得到skipped frames error。并且我的应用程序被冻结,直到视图中MessagingCenter.Subscribe
中的每个任务都完成为止。 ActivityIndicator
显示为不。
解决方法
您可以尝试使用async
方法来按如下方式调用这些方法:
MessagingCenter.Subscribe<PageMain,string>(this,"HI",async (sender,arg) =>
{
var dt = DateTime.Now;
_logger.Debug($"Task started: {dt}");
ActivityIndicator.IsVisible = true;
ActivityIndicator.IsRunning = true;
await SomeTask();
_logger.Debug($"Task finished: {DateTime.Now - dt}");
ActivityIndicator.IsVisible = false;
ActivityIndicator.IsRunning = false;
});
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。