2

Android の wifi 接続について具体的な質問があります。Web サーバーからデータをダウンロードするプロジェクトに取り組んでおり、同期を開始する前に毎回、次のようなインターネット接続について確認しています。

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

public static boolean chkNetworkStatus(Context context) {
    boolean result = false;
    new Thread() {
        @Override
        public void run() {


           for(int i=0;i<3;i++){
           HttpGet requestForTest = new HttpGet("http://m.google.com");
           try {
                  new DefaultHttpClient().execute(requestForTest);
                  responded = true;
                } catch (Exception e) {
                    responded = false;
                }
           }
        }
    }.start();
    boolean isOnline = isOnline(context);
    if(responded && isOnline){
        result = true;
    } else {
        result = false;
    }

    Log.e("","responded : "+responded);
    return result;
}

しかし、この状況では、まだwifiに接続していて、歩いている(接続が失われている)ときに同期ボタンを押すと、接続されているためまだtrueが返されますが、実際には何もしていません.

これを検出できる方法はありますか、それとも使用しているクラスでconnectionTimeOut関数を使用する必要がありますか?HttpURLConnection

4

3 に答える 3

1

基本的に、登録するとネットワーク接続が変化したときにブロードキャストを受信します。

android.net.conn.CONNECTIVITY_CHANGE

ソリューションについて どうぞ。

BroadCastReceiver に登録して処理する必要がありますandroid.net.conn.CONNECTIVITY_CHANGE

ステップ1

次の権限をマニフェストに含めます

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

ステップ2

どのクラスがブロードキャスト レシーバーに登録されるかを Android に知らせます。

<receiver android:name="ConnectivityReceiver_package_name.ConnectivityReceiver">
   <intent-filter>
      <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
   </intent-filter>
</receiver>

ステップ 3

さまざまなネットワーク状態のロジックを配置します。

public class ConnectivityReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {

     String action = intent.getAction();

    boolean noConnectivity = intent.getBooleanExtra(ConnectivityManager.EXTRA_NO_CONNECTIVITY,false);

     if(noConnectivity){

         //Show Warning Message
         //Take appropriate actions.
     }

    }

}
于 2012-06-14T12:43:40.943 に答える
1

実際、これで問題が解決するかどうかはわかりませんが、HttpGetリクエストで接続タイムアウトを設定できます。

これは私の場合に機能するため、インターネットの可用性を確認する必要はありません..

try
  {

   HttpGet request = new HttpGet(url));
   HttpParams httpParameters = new BasicHttpParams();
   // Set the timeout in milliseconds until a connection is established.
   // The default value is zero, that means the timeout is not used. 
   int timeoutConnection = 60000;
   HttpConnectionParams.setConnectionTimeout(httpParameters, timeoutConnection);
   // Set the default socket timeout (SO_TIMEOUT) 
   // in milliseconds which is the timeout for waiting for data.
   int timeoutSocket = 60000;
   HttpConnectionParams.setSoTimeout(httpParameters, timeoutSocket);
   // create object of DefaultHttpClient    
   DefaultHttpClient httpClient = new DefaultHttpClient(httpParameters);
   request.addHeader("Content-Type", "application/json");
   HttpResponse response = httpClient.execute(request);
   // get response entity
   HttpEntity entity = response.getEntity();
   // convert entity response to string

     if (entity != null)
      {
         result = EntityUtils.toString(entity);
      }

   }
 catch (SocketException e)
  {
     return "-222" + e.toString();
  }
 catch (Exception e)
  {
     return "-333" + e.toString();
  }

注:リクエストとその他のコードは、ケースによって異なる場合があります。これは、HttpGetparams が Connection TimeOut の設定にどのように使用されるかという考えにすぎません。

于 2012-06-14T12:42:53.687 に答える
1

このようにしてみてください:

public static void isNetworkAvailable(final Handler handler, final int timeout)
{

    // ask fo message '0' (not connected) or '1' (connected) on 'handler'
    // the answer must be send before before within the 'timeout' (in
    // milliseconds)

    new Thread()
    {

        private boolean responded = false;

        @Override
        public void run()
        {

            // set 'responded' to TRUE if is able to connect with google
            // mobile (responds fast)

            new Thread()
            {

                @Override
                public void run()
                {
                    HttpGet requestForTest = new HttpGet("http://m.google.com");
                    try
                    {
                        new DefaultHttpClient().execute(requestForTest); // can
                                                                            // last...
                        responded = true;
                    }
                    catch (Exception e)
                    {
                    }
                }

            }.start();

            try
            {
                int waited = 0;
                while (!responded && (waited < timeout))
                {
                    sleep(100);
                    if (!responded)
                    {
                        waited += 100;
                    }
                }
            }
            catch (InterruptedException e)
            {
            } // do nothing
            finally
            {
                if (!responded)
                {
                    handler.sendEmptyMessage(0);
                }
                else
                {
                    handler.sendEmptyMessage(1);
                }
            }

        }

    }.start();

}

Handler h = new Handler()
{

    @Override
    public void handleMessage(Message msg)
    {

        if (msg.what != 1)
        { // code if not connected


        }
        else
        { // code if connected


        }

    }
};

そしてあなたのアクティビティで、それを次のように呼び出します:

 isNetworkAvailable(h, 2000);
于 2012-06-14T12:38:38.807 に答える