1

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クラスを追加します。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 に答える