MonoTouch:网络检测期间不显示LoadingView

时间:2012-08-16 15:09:32

标签: networking xamarin.ios uialertview uiactivityindicatorview

我正在使用LoadingView(带有UIActivityIndi​​catorView的自定义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)时,它是完美的。它显示正确。但是当我有一些网络时,它会冻结。 然后,经过很长一段时间,我可以看到“网络已找到”并且事情正常进行。

我根本不明白发生了什么。你有什么想法吗?

提前感谢您提供的帮助。

1 个答案:

答案 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进行交互,这会在主线程上调用您的代码。