HTTP не работает в эмуляторе Android

Я пробовал несколько классов HTTP ( HttpURLConnection , HTTPClient и другие), но они не работают в эмуляторе. Тогда я решил проверить это на своем телефоне, и это сработало хорошо!

Итак, как я могу исправить это странное поведение эмулятора Android, что классы HTTP не работают (в то время как браузер может работать)? Они вообще рушат приложение.

Вот мой код:

 public static SimpleXML getResponse(String action, Map<String, String> params) { // Create a new HttpClient and Post Header HttpClient httpclient = new DefaultHttpClient(); HttpPost httppost = new HttpPost(action); try { // Add your data List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(params.size()); for(Map.Entry<String, String> heh : params.entrySet()) nameValuePairs.add(new BasicNameValuePair(heh.getKey(), heh.getValue())); httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs)); // Execute HTTP Post Request HttpResponse response = httpclient.execute(httppost); return SimpleXML.loadXml(response.getEntity().getContent()); } catch (ClientProtocolException e) { return null; } catch (IOException e) { return null; } } 

Журнал LogCat:

 06-30 22:07:28.972: E/AndroidRuntime(682): FATAL EXCEPTION: main 06-30 22:07:28.972: E/AndroidRuntime(682): android.os.NetworkOnMainThreadException 06-30 22:07:28.972: E/AndroidRuntime(682): at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1117) 06-30 22:07:28.972: E/AndroidRuntime(682): at java.net.InetAddress.lookupHostByName(InetAddress.java:385) 06-30 22:07:28.972: E/AndroidRuntime(682): at java.net.InetAddress.getAllByNameImpl(InetAddress.java:236) 06-30 22:07:28.972: E/AndroidRuntime(682): at java.net.InetAddress.getAllByName(InetAddress.java:214) 06-30 22:07:28.972: E/AndroidRuntime(682): at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:137) 06-30 22:07:28.972: E/AndroidRuntime(682): at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:164) 06-30 22:07:28.972: E/AndroidRuntime(682): at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:119) 06-30 22:07:28.972: E/AndroidRuntime(682): at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:360) 06-30 22:07:28.972: E/AndroidRuntime(682): at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555) 06-30 22:07:28.972: E/AndroidRuntime(682): at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487) 06-30 22:07:28.972: E/AndroidRuntime(682): at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:465) 06-30 22:07:28.972: E/AndroidRuntime(682): at net.ekvium.air.API.getResponse(API.java:98) 06-30 22:07:28.972: E/AndroidRuntime(682): at net.ekvium.air.MainActivity$1.onClick(MainActivity.java:62) 06-30 22:07:28.972: E/AndroidRuntime(682): at android.view.View.performClick(View.java:4084) 06-30 22:07:28.972: E/AndroidRuntime(682): at android.view.View$PerformClick.run(View.java:16966) 06-30 22:07:28.972: E/AndroidRuntime(682): at android.os.Handler.handleCallback(Handler.java:615) 06-30 22:07:28.972: E/AndroidRuntime(682): at android.os.Handler.dispatchMessage(Handler.java:92) 06-30 22:07:28.972: E/AndroidRuntime(682): at android.os.Looper.loop(Looper.java:137) 06-30 22:07:28.972: E/AndroidRuntime(682): at android.app.ActivityThread.main(ActivityThread.java:4745) 06-30 22:07:28.972: E/AndroidRuntime(682): at java.lang.reflect.Method.invokeNative(Native Method) 06-30 22:07:28.972: E/AndroidRuntime(682): at java.lang.reflect.Method.invoke(Method.java:511) 06-30 22:07:28.972: E/AndroidRuntime(682): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786) 06-30 22:07:28.972: E/AndroidRuntime(682): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 06-30 22:07:28.972: E/AndroidRuntime(682): at dalvik.system.NativeStart.main(Native Method) 

Если вы посмотрите на эту документацию на Android ,

NetworkOnMainThreadException:

Исключение, которое возникает, когда приложение пытается выполнить сетевую операцию в своем основном потоке.

Это делается только для приложений, ориентированных на SDK Honeycomb или выше. Приложениям, использующим более ранние версии SDK, разрешено создавать сети в своих потоках цикла основного события, но это сильно обескураживает.

Таким образом, в зависимости от версии ОС может быть принудительное (исключение) политики, в которой вы не выполняете сетевые запросы в потоке пользовательского интерфейса. Это может объяснить, почему ваш код работает на устройстве, а не на эмуляторе (если у них разные версии Android).

Вы можете изменить ThreadPolicy . Но в качестве альтернативы я бы предложил вам снова взглянуть на заявление в документах Android. Они сильно препятствуют выполнению сетевых операций в основном потоке, и я, конечно, соглашусь с ними.

Таким образом, вместо изменения политики, чтобы сделать ее законной , вы можете подумать об изменении кода, чтобы ваш метод getResponse() не вызывался в потоке пользовательского интерфейса.

Как правило, вы должны использовать AsyncTask для выполнения работы в фоновом режиме .

Это происходит потому, что вы пытаетесь выполнить сетевую активность в основном потоке.

У меня была одна и та же проблема: она работала некоторое время, а затем, после нескольких недель развития, перестала работать.

Решение, которое я нашел, это добавить эти строки в

 onCreate() 

Метод:

  StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build(); StrictMode.setThreadPolicy(policy); 

Надеюсь, это сработает и для вас

РЕДАКТИРОВАТЬ

Из-за увеличения количества авитаций я хочу что-то добавить. Это приведет к удалению NetworkingOnMainThreadException , ОДНАКО, это далеко не рекомендуется.

Это исключение существует по какой-то причине. Сетевая активность может занять много времени, и сетевая работа в основном потоке, которая является тем же потоком, который отвечает за обновление пользовательского интерфейса, заморозит поток до тех пор, пока сеть не будет выполнена (это то, что происходит в каждом потоке, но когда оно выполняется на выделенном Нить, все в порядке). В Android, если UI-поток не активен в течение 5 секунд, он покажет, что Application is not responsive, Do you want to close it? Диалог.

Это то, что исключение стало для предотвращения. Настройка политики, как я и предлагал, в то время как исключает исключение, является неправильным способом выполнения действий. Любые сетевые действия должны выполняться в отдельном потоке либо с помощью AsyncTask либо путем создания нового потока вручную. AsyncTask – очень простой и простой способ реализации этого, и это то, что я рекомендую.

Пожалуйста, примите во внимание это изменение при использовании моего ответа.

ура

Вы отключите строгий режим, используя следующий код:

 if (android.os.Build.VERSION.SDK_INT > 9) { StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build(); StrictMode.setThreadPolicy(policy); } 

Это не рекомендуется: используйте интерфейс AsyncTask .

Ссылка AsyncTask

Ссылка другой ссылки

Intereting Posts
Android – добавление изображения в html webview Можно ли создавать пользовательские наклейки Viber? Ошибка: файл не найден: arch / arm / boot / compress / piggy.lzo ClassCastException не может преобразовать LinearLayout $ LayoutParams в AbsListView $ LayoutParams при настройке заголовка ListView Измените исходное изображение для просмотра изображения при нажатии Спорадическое отставание в игре на Android Android + Robolectric – исключение RuntimeException / InstantiationException в queryBuilder.query () в ContentProvider Нежелательный эффект Warp для рисования текста на пути к андроиду FragmentPager не обновляет представления Отдельные строковые значения Android для выпуска и отладки Изменение ориентации Android Как я могу скопировать содержимое данных / в SDCard / без использования adb? Air – Как выбрать правильный режим аппаратного ускорения? Блокировать входящие тексты (Android) Получить значение href из тега привязки в Android WebView при нажатии ссылки