2013-04-27 61 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,请稍后再试“