2016-11-05 12 views
0

私は以前のコードを修正しました - このコードは正しく動作しています。唯一の問題は、それを起動した後、最初にとして、それは常に出力を示しクリックしていることである:最初のクリックで私に間違った出力が出た

「インターネットは利用できません」しかし、第二に、それは正しい出力を示しています。

public class MainActivity extends Activity { 

    boolean pingCheck; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     Button b1=(Button)findViewById(R.id.button1); 

     b1.setOnClickListener(new View.OnClickListener() { 

      @Override 
      public void onClick(View v) {     
       Thread t = new Thread(new Runnable() { 
        public void run() { 
         pingCheck = isURLReachable(getApplicationContext()); 
        } 
       }); 

       t.start(); 

       if(pingCheck) 
       { 
        Toast.makeText(MainActivity.this,"Network is available",Toast.LENGTH_LONG).show(); 
       } 
       else 
       { 
        Toast.makeText(MainActivity.this,"Network not available",Toast.LENGTH_LONG).show(); 
       }     
      } 
     }); 
    } 


    static public boolean isURLReachable(Context context) { 
     ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); 
     NetworkInfo netInfo = cm.getActiveNetworkInfo(); 

     if (netInfo != null && netInfo.isConnected()) { 
      try { 
       URL url = new URL("http://google.com"); // Change to "http://google.com" for www test. 
       HttpURLConnection urlc = (HttpURLConnection) url.openConnection(); 
       urlc.setConnectTimeout(1000);   // 10 s. 
       urlc.connect(); 

       if (urlc.getResponseCode() == 200) {  // 200 = "OK" code (http connection is fine). 
        Log.wtf("Connection", "Success !"); 
        return true; 
       } else { 
        return false; 
       } 
      } catch (MalformedURLException e1) { 
       return false; 
      } catch (IOException e) { 
       return false; 
      } 
     } 

     return false; 
    } 
} 

答えて

0

スレッド内で非同期タスクを実行し、その直後に結果を確認することはできません。タスクが完了するのを待つ必要があります。私はあなたがあなたのpingチェックへのコールバックを渡すことを提案し、コールバックが戻ったら、if(pingCheck)のコードを実行します。

これは、ジョブを実行する必要があります。

また
public static interface OnInternetCheckCallback { 
    void onInternetCheckResult(boolean available); 
} 

public static void hasInternetAccess(OnInternetCheckCallback callback) { 
    new AsyncTask<OnInternetCheckCallback, Void, Boolean>() { 
     private OnInternetCheckCallback mCallback; 

     @Override 
     protected Boolean doInBackground(OnInternetCheckCallback... params) { 
      mCallback = params[0]; 
      try { 
       URL checkUrl = new URL(HEALTHCHECK_URL); 
       HttpURLConnection connection = (HttpURLConnection) checkUrl.openConnection(); 
       connection.setRequestProperty("User-Agent", "Android"); 
       connection.setRequestProperty("Connection", "close"); 
       connection.setConnectTimeout(1500); 
       connection.connect(); 
       return (connection.getResponseCode() == 200 && connection.getContentLength() <= 0); 
      } catch (IOException e) { 
       Log.e(TAG, ".doInBackground() - Error checking internet connection", e); 
      } 
      return false; 
     } 

     @Override 
     protected void onPostExecute(Boolean result) { 
      mCallback.onInternetCheckResult(result); 
     } 
    }.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, callback); 
} 

、おそらく良いアイデアは、Googleのサーバーは、一部の国でブロックされているようではなくgoogle.comよりも、あなた自身のサーバーに対して確認することです。

+0

申し訳ありません申し訳ありませんが、完全に感謝しています。 –

+0

何か具体的なものはありませんか?今問題を解決しましたか? – vkislicins

+0

http://stackoverflow.com/q/40583324/7095521 –