2013-04-27 44 views
1

原本是一個關於爲什麼當一個BroadcastReceiver說,該設備被連接到互聯網的網絡視圖是失敗的問題的更好的方式:WebView Fails w/ Good Connection確定Internet連接

這導致了兩個答案,一個技術上是正確和解決方法。但是,這兩者都不完美。我的問題是:確定有效的內聯連接的更好方法是什麼?

(1)

public static boolean isConnectedToInternet() 
{ 
    ConnectivityManager cm =  (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE); 

    NetworkInfo activeNetwork = cm.getActiveNetworkInfo(); 
    boolean isConnected = false; 

    if(activeNetwork != null && 
      activeNetwork.isConnected()) 
    { 
     isConnected = true; 
    } 

    return isConnected; 
} 

//WebViewClient override 
public void onReceivedError (WebView view, int errorCode, String description, String failingUrl) 
{ 
    super.onReceivedError(view, errorCode, description, failingUrl); 
    Log.e("web view error: "+errorCode, description); 

    if(errorCode == -6 && 
       isConnectedToInternet()) 
    { 
     view.reload(); 
    } 
    else 
    { 
     view.loadUrl(""); 
    } 
} 

(2)

public class MainActivity extends Activity { 
    boolean mConnected = false; 
    String mURL = "http://www.google.com"; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     VerifyInternetConnectionTask task = new VerifyInternetConnectionTask(); 
     try { 
      mConnected = task.execute(mURL).get(); 
     } catch (InterruptedException e) { 
      Log.e(TAG, "AsyncTask Interrupted Exception", e); 
     } catch (ExecutionException e) { 
      Log.e(TAG, "AsyncTask Execution Exception", e); 
     } 

     if (mConnected) { 
      Toast.makeText(this, "Connected to Internet", Toast.LENGTH_LONG).show(); 
     } else { 
      Toast.makeText(this, "Unable to connect to the Internet", Toast.LENGTH_LONG).show(); 
     } 
    } 

    private class VerifyInternetConnectionTask extends AsyncTask<String, Void, Boolean> { 

     private static final String TAG = "VerifyInternetConnectionTask"; 

     private boolean isNetworksAvailable() { 
      ConnectivityManager mConnMgr = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); 
      if (mConnMgr != null) { 
      NetworkInfo[] mNetInfo = mConnMgr.getAllNetworkInfo(); 
      if (mNetInfo != null) { 
       for (int i = 0; i < mNetInfo.length; i++) { 
        if (mNetInfo[i].getState() == NetworkInfo.State.CONNECTED) { 
         return true; 
        } 
       } 
      } 
      } 
      return false; 
     } 

     @Override 
     protected Boolean doInBackground(final String... params) { 
      final int CONNECTION_TIMEOUT = 2000; 

      if (isNetworksAvailable()) { 
      try { 
       HttpURLConnection mURLConnection = (HttpURLConnection) (new URL(params[0]).openConnection()); 
       mURLConnection.setRequestProperty("User-Agent", "ConnectionTest"); 
       mURLConnection.setRequestProperty("Connection", "close"); 
       mURLConnection.setConnectTimeout(CONNECTION_TIMEOUT); 
       mURLConnection.setReadTimeout(CONNECTION_TIMEOUT); 
       mURLConnection.connect(); 
       return (mURLConnection.getResponseCode() == 200); 
      } catch (IOException ioe) { 
       Log.e(TAG, "Exception occured while checking for Internet connection: ", ioe); 
      } 
      } else { 
      Log.e(TAG, "Not connected to WiFi/Mobile and no Internet available."); 
      } 
      return false; 
     } 
    } 
} 

感謝您的幫助提前

回答

0

在我們的應用程序,使用Web服務,我們實際上採取了兩步法。第一步將包括你的「技術測試」,從理論上看看我們是否有網絡支持。如果我們失敗了,我們會發出一條警告消息,如「未檢測到網絡連接」。

我們做的第二步是,我們用最少的電話來ping我們的服務器,看看我們是否能夠擊中它們。無論我們是否可以在網絡上點擊gajillion網站,只要我們可以打到我們的網站都沒關係,所以我們會先打電話,如果失敗,我們會說「無法連接到siteX,請稍後再試「