2016-11-05 89 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.com谷歌服務器被阻擋在一些國家。

+0

對不起,我沒有得到完全,但謝謝 –

+0

有沒有具體的東西你沒有得到?你現在是否解決了這個問題? – vkislicins

+0

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

相關問題