HonyComb и DefaultHttpClient - PullRequest
       4

HonyComb и DefaultHttpClient

13 голосов
/ 28 января 2011

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

        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)

Есть идеи, что мне следует искать?

Ответы [ 4 ]

32 голосов
/ 28 января 2011

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

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

5 голосов
/ 28 июля 2011

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

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

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

3 голосов
/ 25 июля 2012

Я использовал 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;
        }       
    }
}
3 голосов
/ 20 сентября 2011

предложение 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) {

    }

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

...