我有一个简单的登录屏幕,用于验证用户并使用Restful Web服务获取数据。 Web服务工作正常,我称之为获取数据,解析并存储在本地数据库中。问题是 - 我想在屏幕上添加一个活动指示器。我可以添加活动指示但问题,它永远不会出现在视图上,因为控件会调用Web服务并获取数据。
如何在后台处理时添加活动指示器?
我也尝试过InvokeOnMainThread
MonoTouch.UIKit.UIApplication.SharedApplication.InvokeOnMainThread(delegate{
StartActivityIndicator();
authenticateBtn.Enabled = false;
authenticateBtn.BackgroundColor = UIColor.Gray;
});
// VALIDATE
bool isValid = ValidateTextbox ();
if (isValid == true) {
CreateUserAccount ();
}
CreateUserAccount()方法调用Web服务并解析数据。如果我评论行CreateUserAccount()代码工作正常,我可以看到活动指标。 但是当我添加CreateUserAccount()方法时,活动指示符永远不会出现。
如何调用Web服务并执行UI活动。
答案 0 :(得分:1)
与时俱进,使用C#5
async/await
:
public async void DoSomething ()
{
StartActivityIndicator();
authenticateBtn.Enabled = false;
authenticateBtn.BackgroundColor = UIColor.Gray;
bool isValid = ValidateTextbox ();
if (isValid)
await CreateUserAccount ();
StopActivityIndicator ();
}
答案 1 :(得分:0)
您可以通过在任务中分离Web服务调用来解决此问题。这将在一个单独的线程上执行服务调用,当它完成时,您可以调用InvokeOnMainThread()来完成UI的活动。
这样的东西会起作用,放在你的UIViewController中。
Task CallWebService()
{
return Task.Factory.StartNew(() => {
// make your service call.
});
}
现在,你可以在你的ViewDidLoad中调用它:
// Inside ViewDidLoad method of your UIViewController
//
// Show your activity indicator first.
StartActivityIndicator();
CallWebService().ContinueWith(task => {
if(task.isFaulted)
throw new AggregateException(task.Exception.InnerException.Message);
// Runs when the task is finished
InvokeOnMainThread(() => {
// Hide your activity indicator here.
StopActivityIndicator();
});
});
答案 2 :(得分:0)
您可以在后台工作人员中拨打创建用户帐户
var worker = new BackgroundWorker();
worker.DoWork += (s, ev) => ConnectToPanel();
worker.RunWorkerAsync();