探している情報をプログラムで取得する方法はありません。
デッド ゾーンに入ったばかりのセルラー データ接続でよくあるような「インターネット接続の問題」がある場合、セルラー リンクがタイムアウトになるまで数秒間確立されたままになります。リンク層がまだ接続されていると認識しているが、パケットが通過できないこの待機期間中にできることは、自分で待機を開始し、リンク層のタイムアウト値以下の任意のタイムアウト値を選択することだけです。
タイムアウトベースの接続は、任意の時間待機してから、パケットが到着するかどうかを判断することに基づいているため、ブロックせずに接続が成功するかどうかを判断する一般的な解決策はありません。 . 結局のところ、直前に送信されたパケットが通過したからといって、直後に接続を切断できなかったわけではありません。
どこかの URL から小さなリソースを取得しようとするテストには同意しません。このテストにはブロックが含まれているため問題があり、プログラムの速度が低下します。プログラムが実際に送信しようとしているパケットが、リンク層またはプロトコル層がタイムアウトする前に通過できれば、結果が得られます。パケットが通過しない場合、結果は得られません。それはとても簡単です。
インターネット接続は「一時的な」現象であり、事前に利用可能であることを確認することは不可能です。それはある瞬間にあり、次の瞬間に消えます。ディスク上のファイルの存在のように。インターネット接続に応じてプログラムのロジックのフローを変更しようとする代わりに、パケットが通過しなかった、または応答が得られなかったなど、接続が明らかに利用できない状況に対応する必要があります。ネットワーク インターフェイスは、ダウンしていることを宣言します (これは、本質的に、呼び出している Android API が行っていることです)。例外を処理します。稼働しているかどうかを判断してから何かを実行しようとしないでください。
結論として、リンク層が接続されていると考えるかどうかの簡単なテストを除いて、関数の概念そのものはほとんど無意味です(リンク層がないことは明らかに接続が利用できないことが知られているのに対し、他のすべての障害状態は、問題が実験的に検出されるまで未知数を伴います. )のisNetworkConnected()
isNetworkConnected()
isNetworkConnected()
関数が戻り、実際のデータのアップロード/ダウンロードを開始した時点で、結果は変更されていません。これは基本的に解決できない競合状態です。ユーザーのインターネット インフラストラクチャを制御できないため、原子的に「ロック」して動作状態にし、作業を実行し、ロックを解除することはできません。できません。