1

我正在使用 LoadingView(带有 UIActivityIndi​​catorView 的自定义 UIAlertView)来显示不同的状态。这是加载视图代码:

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 类。我使用 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();
        }
    }

最后,很快找到了网络(感谢 InternetConnectionStatus 方法中的 Console),但是在网络检测之前声明并应该显示的 LoadingView 被冻结。

当根本没有网络(没有数据也没有wifi)时,它是完美的。它显示正确。但是当我有一些网络时,它会冻结。然后,很长一段时间后,我可以看到“找到网络”并且事情正常进行。

我完全不明白发生了什么。你有什么主意吗 ?

提前感谢您提供的帮助。

4

1 回答 1

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

于 2012-08-16T15:41:30.493 回答