我正在使用LoadingView(带有UIActivityIndicatorView的自定义UIAlertView)来显示不同的状态。 这是LoadingView代码:
public class LoadingView : UIAlertView
{
private UIActivityIndicatorView _activityView;
public void Show (string title_)
{
Title = title_;
_activityView = new UIActivityIndicatorView (UIActivityIndicatorViewStyle.WhiteLarge);
_activityView.Frame = new System.Drawing.RectangleF (122, 50, 40, 40);
AddSubview (_activityView);
InvokeOnMainThread (delegate() {
_activityView.StartAnimating ();
});
UIApplication.SharedApplication.NetworkActivityIndicatorVisible = true;
Show ();
}
public void SetTitle (string title_)
{
Title = title_;
}
public void Hide ()
{
UIApplication.SharedApplication.NetworkActivityIndicatorVisible = false;
DismissWithClickedButtonIndex (0, true);
}
}
我也在使用地理定位。为此,用户需要网络连接,运营商数据或WiFi网络。所以,我的应用需要验证网络是否可用。
所以,我添加了Reachability class。我使用InternetConnectionStatus方法:
public static NetworkStatus InternetConnectionStatus ()
{
NetworkReachabilityFlags flags;
bool defaultNetworkAvailable = IsNetworkAvailable (out flags);
if (defaultNetworkAvailable) {
if ((flags & NetworkReachabilityFlags.IsDirect) != 0) {
return NetworkStatus.NotReachable;
}
} else if ((flags & NetworkReachabilityFlags.IsWWAN) != 0) {
return NetworkStatus.ReachableViaCarrierDataNetwork;
} else if (flags == 0) {
return NetworkStatus.NotReachable;
}
return NetworkStatus.ReachableViaWiFiNetwork;
}
我会这样测试:
partial void BtnLocationClick()
{
loading = new LoadingView();
loading.Show("Looking for network");
Console.WriteLine("Looking for network");
if (Reachability.InternetConnectionStatus() != NetworkStatus.NotReachable)
{
loading.SetTitle("Network found");
loading.Hide();
// code here
}
else
{
loading.Hide();
UIAlertView alert = new UIAlertView("Error",
"No network",
null, "Retour", null);
alert.Show();
}
}
最后,快速找到网络(感谢Internet中的ConsoleConnectionStatus方法),但在网络检测之前声明并且应该显示的LoadingView被冻结。
当根本没有网络(没有数据,没有wifi)时,它是完美的。它显示正确。但是当我有一些网络时,它会冻结。 然后,经过很长一段时间,我可以看到“网络已找到”并且事情正常进行。
我根本不明白发生了什么。你有什么想法吗?
提前感谢您提供的帮助。
答案 0 :(得分:2)
您正在执行此工作并阻止UI线程。
假设您这样做了:
loading.Show();
Thread.Sleep(1000);
loading.Hide();
您永远不会看到加载,因为UI线程被阻止且无法呈现加载弹出窗口。
您必须使用.Net线程类来执行以下操作:
loading.Show();
ThreadPool.QueueUserWorkItem(_ =>
{
//Do your long running operation here
BeginInvokeOnMainThread(() => loading.Hide());
});
BeginInvoke部分非常重要。您无法从后台线程与UI进行交互,这会在主线程上调用您的代码。