Intereting Posts
Плагин с id 'com.google.gms.google-services' не найден Сортировка коллекции по нескольким полям в Котлине Android AudioRecord для сервера по вопросам воспроизведения UDP Как написать андроид JUnit-тест, когда моя деятельность зависит от дополнительных параметров, переданных через Intent? Начать MAIN-активность текущего приложения, не зная его имени Как перейти в последнее место редактирования в Android Studio Преобразование даты и времени в миллисекунды в Android Сообщить об установке Android-приложения обратно в facebook, не используя их api Изменение цвета фона кнопки панели задач при нажатии Как изменить цвет панели заголовка и адресной строки в новейшей версии Android Chrome на Lollipop? Создать файл aar в Android Studio Android Studio – JAVA_HOME не указывает на действительную установку JVM Ресурс Android – массив массивов SetImageViewBitmap не работает в виджетах Android BackupAgent: «невозможно восстановить пакет …»

HonyComb и DefaultHttpClient

В моем коде у меня есть это

Log.d("WFlog (executeRequest)", request.toString()) ; httpResponse = client.execute(request); Log.d("WFlog (execute)", request.toString()) ; 

Запуск приложения с помощью Android 2.2 идет хорошо, и в logcat я вижу обе строки журнала.

Теперь запуск приложения с использованием HonyComb для одного и того же фрагмента кода кажется, что я никогда не получаю client.execute правильно. Последняя строка журнала, которую я получаю, имеет «WFlog (executeRequest)».

После этого я вижу следующее:

 01-27 21:54:45.169: WARN/System.err(390): android.os.NetworkOnMainThreadException 01-27 21:54:45.196: WARN/System.err(390): at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1069) 01-27 21:54:45.196: WARN/System.err(390): at dalvik.system.BlockGuard$WrappedNetworkSystem.connect(BlockGuard.java:368) 01-27 21:54:45.205: WARN/System.err(390): at org.apache.harmony.luni.net.PlainSocketImpl.connect(PlainSocketImpl.java:208) 01-27 21:54:45.215: WARN/System.err(390): at org.apache.harmony.luni.net.PlainSocketImpl.connect(PlainSocketImpl.java:431) 01-27 21:54:45.237: WARN/System.err(390): at java.net.Socket.connect(Socket.java:901) 

Любая идея, что я должен искать?

Solutions Collecting From Web of "HonyComb и DefaultHttpClient"

Существуют новые политики, которые позволяют разработчикам приложений и операционных систем устанавливать ожидания производительности для выполнения кода на определенных потоках. Вы пытались вызвать блокировку сети api на нити ui вашего приложения. Google внедрила систему, которая позволяет вам знать, что это плохая идея, и вы можете решить эту проблему, выполнив свой запрос в отдельном потоке или asyncTask.

Пожалуйста, прочитайте это сообщение в блоге. Вы можете найти информацию об использовании асинхронных / многопоточных приложений по всему SO и Google.

Спасибо, Ник. Это сработало для меня. Для целей dev я просто устанавливаю политику потока по умолчанию, делая это

 *ThreadPolicy tp = ThreadPolicy.LAX; StrictMode.setThreadPolicy(tp);* 

Это необходимо удалить для окончательной версии.

Предложение abhinaw написано как отражение, поэтому код также работает с более старыми версиями API:

  try { Class strictModeClass=Class.forName("android.os.StrictMode"); Class strictModeThreadPolicyClass=Class.forName("android.os.StrictMode$ThreadPolicy"); Object laxPolicy = strictModeThreadPolicyClass.getField("LAX").get(null); Method method_setThreadPolicy = strictModeClass.getMethod( "setThreadPolicy", strictModeThreadPolicyClass ); method_setThreadPolicy.invoke(null,laxPolicy); } catch (Exception e) { } 

Да, это должно быть удалено для окончательной версии.

Я использовал asynctask, видел его в других потоках, и он работал нормально …. Я создаю подкласс, где я хотел бы вызвать сетевое соединение. Я не знаю, если это лучший способ, но этот код работал для меня ….

 public miclase{ public boolean comprobarMP3(int canal){ boolean retorno=true; //This commented Code is what it was NOT working //swr= new ServicioWebRest(); //contenido=swr.obtieneContenido(Channels.getInstance().getChannel().get(canal).getId()); try{ //this.get() was important, i had troubles in recovering the objet, .get() solved it contenido=new getContenidoAsync().execute(canal).get(); }catch(Exception e){ contenido=null; } } //Clase interna para acceder a los webservice de un modo asincrono en otro hilo //Desde el sdk 11, las politicas de seguridad de android no permiten acceder a internet desde el hilo principal public class getContenidoAsync extends AsyncTask<Integer, Void, Contenido>{ Contenido c=new Contenido(); @Override protected Contenido doInBackground(Integer... urls) { //aqui el codigo q sea, yo llamo a este que llama a otra clase que es el q llama a http return new ServicioWebRest().obtieneContenido(Channels.getInstance().getChannel().get(urls[0]).getId()); } @Override protected void onPostExecute(Contenido result) { c=result; } } }