Xamarin - 使用async/await和ProgressDialog
问题描述:
Im使用Xamarin和C#构建一个android应用程序。 该应用程序使用restsharp连接到我的服务器并提取我需要的信息。Xamarin - 使用async/await和ProgressDialog
我试图建立一个注册页面,我想检查用户是否存在。 我想在后台执行此操作,而用户看到ProgressDialog。
这是我的代码:
if (!string.IsNullOrEmpty(PhoneNumber) && !string.IsNullOrEmpty(Password)
&& !string.IsNullOrEmpty(LicenceId) && LicenceImage.Length > 1)
{
ProgressDialog mDialog = new ProgressDialog(this);
mDialog.SetMessage("Loading data...");
mDialog.SetCancelable(false);
mDialog.Show();
bool checkExistance = await api.CheckIfExist(PhoneNumber);
if (checkExistance)
{
Android.Support.V7.App.AlertDialog.Builder alert = new Android.Support.V7.App.AlertDialog.Builder(this);
alert.SetTitle("");
}
else
{
Intent intent = new Intent(this, typeof(RegisterDone));
StartActivity(intent);
}
}
的ProgressDialog节目,但总比没有happedns。 我试图用其他方式做到这一点,但仍然在不断努力。
这是干什么用的吗? Thx
答
我想检查用户是否存在。我想这样做的背景,而用户看到ProgressDialog
在Android中,你可以使用Handler来实现此功能。当您显示ProgressDialog
时,您可以使用Handler
打开一个新线程来执行验证。当你得到结果时,发送信息到Handler
,在Handler
类中,你可以得到结果并做你的逻辑。这里有一个例子:
显示ProgressDialog
和使用Handler
打开一个新的线程来执行验证:如果用户存在,并返回一个值
mDialog = new ProgressDialog(this);
mDialog.SetMessage("Loading data...");
mDialog.SetCancelable(false);
mDialog.Show();
Action action =() =>
{
checkExistance();
};
handler = new MyHandler(this);
handler.Post(action);
检查,发送消息至MyHandler
:
private async void checkExistance()
{
bool checkExistance = api.CheckIfExist(PhoneNumber);
Message msg = new Message();
msg = handler.ObtainMessage();
if (checkExistance)
{
msg.Arg1 = 0;//tell MyHandler exist
}
else
{
msg.Arg1 = 1;//tell MyHandler didnt exist
}
handler.SendMessage(msg);
}
在
MyHandler
手柄消息:
public class MyHandler : Handler
{
private MainActivity mainActivity;
public MyHandler(MainActivity mainActivity)
{
this.mainActivity = mainActivity;
}
public override void HandleMessage(Message msg)
{
switch (msg.Arg1)
{
case 0:
//true
mainActivity.Exist();
mainActivity.mDialog.Dismiss();
break;
case 1:
//false
mainActivity.Regist();
mainActivity.mDialog.Dismiss();
break;
default:
break;
}
base.HandleMessage(msg);
}
}
Exist()
方法和Regist()
在MainActivity
:
public void Exist()
{
Android.Support.V7.App.AlertDialog.Builder alert = new Android.Support.V7.App.AlertDialog.Builder(this);
alert.SetTitle("");
}
public void Regist()
{
Intent intent = new Intent(this, typeof(RegisterDone));
StartActivity(intent);
}
效果:
提防异步的,因为它创造了一个新的线程,并改变你需要在UI线程的对话框。 – rmjoia
您是否尝试过使用断点来查看'api.CheckIfExist(PhoneNumber);'是否运行? –
是的,thia方法运行并返回一个布尔值。问题是服务器返回结果后什么也没有发生 –