我必须在我的Xamarin项目中使用一个函数,它有一个DoOperation(Func<object, bool> ConfirmOperation)
重载,对象有一个属性,叫做string TextToCheck,函数要检查这个属性,如果符合一定的条件,就需要询问用户是否要继续操作,DoOperation(Func<object, bool> ConfirmOperation)
自身调用的Func<object, bool>
函数的实现在Windows中类似于以下内容。窗体:
private bool ConfirmOperation(object Object) {
if(Object.TextToCheck == Criteria) {
if(MessageBox.Show("MESSAGE", "TITLE", MessageBoxButtons.YesNo) == DialogResult.No) {
return false;
} else {
return true;
}
} else
return true;
}
当然,这会阻塞UI,但至少它是有效的,我看不出在这种情况下阻塞有什么缺点。
我的问题是:如何在我的Xamarin.Android项目(Android 4.4.2)中实现这个private bool ConfirmOperation(object Object)
函数,该函数会提示用户并根据Yes/No按钮按下返回bool结果,并且不会阻塞UI?
这显然行不通,因为. Show()不会阻塞UI:
private bool ConfirmOperation(object Object) {
if(Object.TextToCheck!= "AABBCCDD") {
AlertDialog.Builder AlertDialog = new AlertDialog.Builder(this);
AlertDialog.SetTitle("Warning!");
AlertDialog.SetMessage("Do you want to proceed with the operation?");
AlertDialog.SetNegativeButton("No", (senderAlert, args) => {
});
AlertDialog.SetPositiveButton("Yes", (senderAlert, args) => {
});
AlertDialog.Show();
return TheResultFromTheAlertDialog;
}
else {
return true;
}
}
2条答案
按热度按时间m4pnthwp1#
提示用户,并根据按下是/否按钮返回布尔结果,并且不会阻塞UI?
这里有一个更优雅的解决方案,您可以使用AutoResetEvent显示Alert,然后将其 Package 在Task中并将其命名为
Async
。示例:
用法:
它完美地工作。
您可以使用
Looper.Loop()
来阻止UI线程,直到您从ConfirmOperation
方法获得结果。最重要的是,此方法不会触发ANR
。下面是我的代码:
当它不符合你的条件时,它会显示一个
Dialog
并阻塞主线程。一旦用户点击yes
或no
按钮,它会发送一条消息并抛出新的RuntimeException()
,因此,这个块将被解除,你可以在你的Handler
类中接收消息。然后你可以调用ConfirmOperation
方法得到结果。(只需做出判断并返回一个值。)ghhkc1vu2#
对于这种情况,TaskCompletionSource类非常有用。
何时应使用TaskCompletionSource?
请考虑实现以下扩展方法
如有疑问
通知