2013-03-27 76 views
3

嗨,尝试通过使用下面的方法来检查网络连接及因特网本网络上的主线程异常

校验=新ConnectionDetector(getApplicationContext());

conn = check.isConnectingToInternet();

public class ConnectionDetector { 

private Context _context; 

public ConnectionDetector(Context context){ 
    this._context = context; 
} 

/** 
* Checking for all possible internet providers 
* **/ 
/*public boolean isConnectingToInternet(){ 
    ConnectivityManager connectivity = (ConnectivityManager) _context.getSystemService(Context.CONNECTIVITY_SERVICE); 
     if (connectivity != null) 
     { 
      NetworkInfo[] info = connectivity.getAllNetworkInfo(); 
      if (info != null) 
       for (int i = 0; i < info.length; i++) 
        if (info[i].getState() == NetworkInfo.State.CONNECTED) 
        { 
         return true; 
        } 

     } 
     return false; 
}*/ 

public boolean isConnectingToInternet(){ 
    try{ 
     ConnectivityManager cm = (ConnectivityManager)_context.getSystemService 
                (Context.CONNECTIVITY_SERVICE); 
     NetworkInfo netInfo = cm.getActiveNetworkInfo(); 
     Log.d("NetInfo", String.valueOf(netInfo)); 
     if (netInfo != null && netInfo.isConnected()) 
     { 
      //Network is available but check if we can get access from the network. 
      URL url = new URL("http://www.Google.com/"); 
      HttpURLConnection urlc = (HttpURLConnection) url.openConnection(); 
      urlc.setRequestProperty("Connection", "close"); 
      urlc.setConnectTimeout(2000); // Timeout 2 seconds. 
      urlc.connect(); 
      Log.d("NetInfo Response Code", String.valueOf(urlc.getResponseCode())); 
      // Toast.makeText(getApplicationContext(), String.valueOf(urlc.getResponseCode()), Toast.LENGTH_LONG).show(); 
      if (urlc.getResponseCode() == 200) //Successful response. 
      { 
       return true; 
      } 
      else 
      { 
       Log.d("NO INTERNET", "NO INTERNET"); 
       return false; 
      } 
     } 
    } 
    catch(Exception e) 
    { 
     e.printStackTrace(); 
    } 
    return false; 
} 

}

注:

但是,这将返回NetworkOnMainThread异常喜欢follows.kindly任何一个建议我我做了什么错误.......

03-27 12:53:35.617: W/System.err(1095): android.os.NetworkOnMainThreadException 
03-27 12:53:35.627: W/System.err(1095):  at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1084) 
03-27 12:53:35.637: W/System.err(1095):  at java.net.InetAddress.lookupHostByName(InetAddress.java:391) 
03-27 12:53:35.637: W/System.err(1095):  at java.net.InetAddress.getAllByNameImpl(InetAddress.java:242) 
03-27 12:53:35.647: W/System.err(1095):  at java.net.InetAddress.getAllByName(InetAddress.java:220) 
03-27 12:53:35.647: W/System.err(1095):  at libcore.net.http.HttpConnection.<init>(HttpConnection.java:71) 
03-27 12:53:35.657: W/System.err(1095):  at libcore.net.http.HttpConnection.<init>(HttpConnection.java:50) 
03-27 12:53:35.668: W/System.err(1095):  at libcore.net.http.HttpConnection$Address.connect(HttpConnection.java:351) 
03-27 12:53:35.668: W/System.err(1095):  at libcore.net.http.HttpConnectionPool.get(HttpConnectionPool.java:86) 
03-27 12:53:35.677: W/System.err(1095):  at libcore.net.http.HttpConnection.connect(HttpConnection.java:128) 
03-27 12:53:35.687: W/System.err(1095):  at libcore.net.http.HttpEngine.openSocketConnection(HttpEngine.java:308) 
03-27 12:53:35.699: W/System.err(1095):  at libcore.net.http.HttpEngine.connect(HttpEngine.java:303) 
03-27 12:53:35.699: W/System.err(1095):  at libcore.net.http.HttpEngine.sendSocketRequest(HttpEngine.java:282) 
03-27 12:53:35.707: W/System.err(1095):  at libcore.net.http.HttpEngine.sendRequest(HttpEngine.java:232) 
03-27 12:53:35.718: W/System.err(1095):  at libcore.net.http.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:80) 
03-27 12:53:35.727: W/System.err(1095):  at com.slet.routemytrips.beta.ConnectionDetector.isConnectingToInternet(ConnectionDetector.java:50) 
03-27 12:53:35.727: W/System.err(1095):  at com.slet.routemytrips.beta.Disclaimer$1.onClick(Disclaimer.java:178) 
03-27 12:53:35.738: W/System.err(1095):  at android.view.View.performClick(View.java:3480) 
03-27 12:53:35.738: W/System.err(1095):  at android.view.View$PerformClick.run(View.java:13983) 
03-27 12:53:35.748: W/System.err(1095):  at android.os.Handler.handleCallback(Handler.java:605) 
03-27 12:53:35.757: W/System.err(1095):  at android.os.Handler.dispatchMessage(Handler.java:92) 
03-27 12:53:35.757: W/System.err(1095):  at android.os.Looper.loop(Looper.java:137) 
03-27 12:53:35.767: W/System.err(1095):  at android.app.ActivityThread.main(ActivityThread.java:4340) 
03-27 12:53:35.777: W/System.err(1095):  at java.lang.reflect.Method.invokeNative(Native Method) 
03-27 12:53:35.777: W/System.err(1095):  at java.lang.reflect.Method.invoke(Method.java:511) 
03-27 12:53:35.787: W/System.err(1095):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784) 
03-27 12:53:35.797: W/System.err(1095):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551) 
03-27 12:53:35.807: W/System.err(1095):  at dalvik.system.NativeStart.main(Native Method) 
03-27 12:57:05.237: D/dalvikvm(90): GC_CONCURRENT freed 666K, 10% free 12624K/14023K, paused 6ms+10ms 

回答

8

您无法在主线程上发出HTTP请求,这会导致UI冻结。所以它会抛出异常。您需要在AsyncTask或其他线程中执行此操作。如果试图使主UI线程的网络请求

1

http://developer.android.com/reference/android/os/NetworkOnMainThreadException.html

NetworkOnMainThreadException被抛出。所以所有与网络相关的操作都应该在后台线程上完成。

AsyncTask被设计成围绕线程和处理程序的助手类,并不构成通用线程框架。 AsyncTasks理想情况下应该用于短操作(最多几秒钟)。如果您需要让线程长时间运行,强烈建议您使用java.util.concurrent pacakge提供的各种API如Executor,ThreadPoolExecutor和FutureTask。

http://developer.android.com/reference/android/os/AsyncTask.html

class TheTask extends AsyncTask<Void,Void,Void> 
{ 
      protected void onPreExecute() 
      {   super.onPreExecute(); 
        //display progressdialog. 
      } 

      protected void doInBackground(Void ...params) 
      { 
       //http request. do not update ui here 

       return null; 
      } 

      protected void onPostExecute(Void result) 
      {  
        super.onPostExecute(result); 
        //dismiss progressdialog. 
        //update ui 
      } 

} 

一种替代的AsyncTask是Robospice。可以做出多个香料请求。在ui线程上通知。 https://github.com/octo-online/robospice

检查Netowrk连接。

在你的活动

public class MainActivity extends Activity { 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    if(CheckNetwork.isInternetAvailable(MainActivity.this)) 
    { 
     //call asyntask and make http request. 
    } 
} 

CheckNetwork类

public class CheckNetwork { 

private static final String TAG = CheckNetwork.class.getSimpleName(); 

public static boolean isInternetAvailable(Context context) 
{ 
    NetworkInfo info = (NetworkInfo) ((ConnectivityManager) 
    context.getSystemService(Context.CONNECTIVITY_SERVICE)).getActiveNetworkInfo(); 

    if (info == null) 
    { 
     Log.d(TAG,"no internet connection"); 
     return false; 
    } 
    else 
    { 
     if(info.isConnected()) 
     { 
      Log.d(TAG," internet connection available..."); 
      return true; 
     } 
     else 
     { 
      Log.d(TAG," internet connection"); 
      return true; 
     } 

    } 
} 
} 
+0

感谢。但在我的情况下,我曾经从另一个班级调用方法只有 – 2013-03-27 12:10:36

+0

我不理解你的评论。你能否详细说明。你需要写信给你检查网络连接,你可以在任何活动中再次使用它。你所要做的就是传递活动上下文。它更容易 – Raghunandan 2013-03-27 12:13:44

相关问题