2
public boolean isNetworkConnected() {
    ConnectivityManager cm =
        (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo netInfo = cm.getActiveNetworkInfo();
    if (netInfo != null && netInfo.isConnectedOrConnecting()) {
        return true;
    }
    return false;
}

この機能は、インターネットが接続されているか切断されているときはいつでも正常に機能します。しかし、インターネットが接続されているシナリオがありますが、インターネットに何らかの問題があるため、パケットを交換できないか、閲覧できないと言えます。その状態でもこの関数から取得しますが、インターネットが完全に正常に機能している場合にのみtrue戻りたいと考えています。true

このシナリオで何ができますか? ありがとう。

4

5 に答える 5

1

たとえば、HTTP Get を google.com またはアップタ​​イムの高い別の Web サイトに試すことができます。

于 2012-09-25T17:47:36.103 に答える
1

このような場合、唯一確実な方法は、小さな既知のファイルをダウンロードして、その整合性を検証することです。これが必要になる 1 つのケースは、オープン カフェの Wi-Fi です。誰でも接続できますが、利用規約に同意するまで、すべてのネットワーク リクエストは「ゲートウェイ」にリダイレクトされます。

于 2012-09-25T17:48:03.277 に答える
1

はい、ネットワークが接続されている状況が存在する可能性があるため、httpタイムアウト例外などのいくつかのシナリオで発生しますが、実際のインターネット接続はありません。これは、たとえばVPNを介してアクセスする唯一の方法であるためです-このように、また、たとえば、WI-FI接続は利用できますが、ISPの問題により実際のインターネットトラフィックはありません。

http リクエストの実行方法とインターネットの可用性を確認する方法を説明しているこのスレッドを参照することをお勧めします。

于 2012-09-25T17:52:49.517 に答える
1

探している情報をプログラムで取得する方法はありません。

デッド ゾーンに入ったばかりのセルラー データ接続でよくあるような「インターネット接続の問題」がある場合、セルラー リンクがタイムアウトになるまで数秒間確立されたままになります。リンク層がまだ接続されていると認識しているが、パケットが通過できないこの待機期間中にできることは、自分で待機を開始し、リンク層のタイムアウト値以下の任意のタイムアウト値を選択することだけです。

タイムアウトベースの接続は、任意の時間待機してから、パケットが到着するかどうかを判断することに基づいているため、ブロックせずに接続が成功するかどうかを判断する一般的な解決策はありません。 . 結局のところ、直前に送信されたパケットが通過したからといって、直後に接続を切断できなかったわけではありません。

どこかの URL から小さなリソースを取得しようとするテストには同意しません。このテストにはブロックが含まれているため問題があり、プログラムの速度が低下します。プログラムが実際に送信しようとしているパケットが、リンク層またはプロトコル層がタイムアウトする前に通過できれば、結果が得られます。パケットが通過しない場合、結果は得られません。それはとても簡単です。

インターネット接続は「一時的な」現象であり、事前に利用可能であることを確認することは不可能です。それはある瞬間にあり、次の瞬間に消えます。ディスク上のファイルの存在のように。インターネット接続に応じてプログラムのロジックのフローを変更しようとする代わりに、パケットが通過しなかった、または応答が得られなかったなど、接続が明らかに利用できない状況に対応する必要があります。ネットワーク インターフェイスは、ダウンしていることを宣言します (これは、本質的に、呼び出している Android API が行っていることです)。例外を処理します。稼働しているかどうかを判断してから何かを実行しようとしないでください。

結論として、リンク層が接続されていると考えるかどうかの簡単なテストを除いて、関数の概念そのものはほとんど無意味です(リンク層がないことは明らかに接続が利用できないことが知られているのに対し、他のすべての障害状態は、問題が実験的に検出されるまで未知数を伴います. )のisNetworkConnected()isNetworkConnected()isNetworkConnected()関数が戻り、実際のデータのアップロード/ダウンロードを開始した時点で、結果は変更されていません。これは基本的に解決できない競合状態です。ユーザーのインターネット インフラストラクチャを制御できないため、原子的に「ロック」して動作状態にし、作業を実行し、ロックを解除することはできません。できません。

于 2012-09-25T17:56:29.950 に答える
0

あなたが接続しているネットワークに表示されるこのチュートリアルを見てください。

于 2012-09-25T17:53:45.153 に答える