2017-09-26 68 views
0

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

+0

提防异步的,因为它创造了一个新的线程,并改变你需要在UI线程的对话框。 – rmjoia

+0

您是否尝试过使用断点来查看'api.CheckIfExist(PhoneNumber);'是否运行? –

+0

是的,thia方法运行并返回一个布尔值。问题是服务器返回结果后什么也没有发生 –

回答

0

我想检查用户是否存在。我想这样做的背景,而用户看到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); 
} 

效果:

enter image description here