0

私は非常に一般的な問題を抱えており、すべての Android 開発者がいつか直面すると思います。Webサーバーからデータをロードするアプリを作成しています。そのため、インターネット接続が使用されています。ただし、サーバーを呼び出すたびに、インターネット接続を確認する必要があります。私は ConnectivityManager を使用してそれを行っていますが、動作します。

私の問題は、実際には、インターネット接続が失われた場合にユーザーに通知することです。インターネット接続が失われたことを知らせる AlertDialog ボックスをユーザーに表示したいと考えています。問題は、ユーザーがボタンをクリックして新しいアクティビティを開始する必要がある場合(サーバーからデータをロードする)、呼び出し元のアクティビティでダイアログボックスを表示できないことです。ここでの問題は、インターネットが利用できない場合、他のアクティビティに移動したくないということです。このまま活動を続けていきたいです。

このアクティビティには多くのボタンがあり、それらをクリックすると、ユーザーはさまざまなアクティビティに移動できます。私が望むのは、インターネットが利用できない場合は他のアクティビティを開かず、このアクティビティのダイアログ ボックスのみを表示することだけです。これを行う 1 つの方法は、(onClick メソッドで) すべてのボタンのクリックをチェックし、インターネット接続が失われたことをユーザーに通知することです。しかし、多くのアクティビティがあり、すべてのアクティビティに多くのボタンがあるため、これは私にとって非常に忙しいかもしれません.

このアクティビティが残っていて、新しいアクティビティが開始されているかどうかを確認するための一般的で効率的な方法はありますか?それを見つけた後、インターネットが利用できない場合に次のアクティビティに移動するのではなく、ユーザーにダイアログ ボックスを表示します.最高のものは何ですか?この問題を処理するためのプラクティス。私を助けてください。私は過去2日間これにこだわっています。事前にサンクス。

 @Override
  public void onClick(View view) {
    switch(view.getId()){
       case R.id.backIcon:
           navigateMenuScreen(view);
           break;
    }
 }

インターネット接続を確認する方法は次のとおりです(正常に動作します):

   ConnectivityManager connectivityManager   = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();

    if (networkInfo!=null && networkInfo.isConnected()) {
        return true;
    } else {
        return false; 
    }

これはナビゲーション方法です:

    public void navigateMenuScreen(View view){
    try {           
        Intent loginIntent = new Intent(view.getContext(), MenuActivity.class);      
        startActivityForResult(loginIntent, 0);     
        overridePendingTransition(android.R.anim.slide_in_left, android.R.anim.slide_out_right);        
    } catch(Exception ex) {
    }
}

私の質問は、すべてのナビゲーション方法でインターネット接続を確認する必要がありますか (上記のような方法は他にもあります)、それとももっと良い方法がありますか?

4

2 に答える 2

2

登録

   registerReceiver(mConnReceiver, 
       new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION));

聞く:

  private BroadcastReceiver mConnReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            boolean noConnectivity = intent.getBooleanExtra(ConnectivityManager.EXTRA_NO_CONNECTIVITY, false);
            String reason = intent.getStringExtra(ConnectivityManager.EXTRA_REASON);
                        boolean isFailover = intent.getBooleanExtra(ConnectivityManager.EXTRA_IS_FAILOVER, false);

            NetworkInfo currentNetworkInfo = (NetworkInfo) intent.getParcelableExtra(ConnectivityManager.EXTRA_NETWORK_INFO);
            NetworkInfo otherNetworkInfo = (NetworkInfo) intent.getParcelableExtra(ConnectivityManager.EXTRA_OTHER_NETWORK_INFO);

            // do application-specific task(s) based on the current network state, such 
            // as enabling queuing of HTTP requests when currentNetworkInfo is connected etc.
        }
    };

マニフェストファイルを忘れないでください

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
于 2012-08-31T09:37:47.647 に答える
1

可能な解決策 (Android 3.0 以降向けに開発していると仮定) は、AsyncTaskLoader( docs ) を使用することです。これは、ユーザーが のボタンを押すとActivity1、データを取得する「バックグラウンド」タスクを起動することを意味します。データのダウンロードに成功すると、 が表示されますActiivty2

これにより、データが表示されるまでにデータActivity2が表示されることが保証されますが、すぐに表示されることは保証されませんActivity2(または、書き方によってはまったく表示されません)。

これがあなたの求めているものかどうかはわかりませんが、読む価値はあります。

于 2012-08-31T10:18:28.093 に答える