NetWork В главной теме Исключение

Привет, Я пытаюсь проверить подключение к сети и Интернет, используя следующий метод

Check = new 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, например, следующим образом. Любой, кто подскажет мне, какие ошибки я сделал …….

 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 

Вы не можете делать HTTP-запросы в основном потоке, это приведет к зависанию пользовательского интерфейса. Таким образом, это исключает это исключение. Вам нужно сделать это в AsyncTask или другом потоке.

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

NetworkOnMainThreadException если вы NetworkOnMainThreadException сделать сетевой запрос в основном NetworkOnMainThreadException пользовательского интерфейса. Поэтому вся сетевая операция должна выполняться в фоновом потоке.

AsyncTask разработан как вспомогательный класс вокруг Thread и Handler и не представляет собой общую структуру потоков. AsyncTasks в идеале следует использовать для коротких операций (не более нескольких секунд). Если вам нужно поддерживать потоки в течение длительных периодов времени, настоятельно рекомендуется использовать различные API, предоставляемые java.util.concurrent pacakge, такие как Исполнитель, 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; } } } }