【问题标题】:HonyComb and DefaultHttpClientHoneyComb 和 DefaultHttpClient
【发布时间】:2011-01-27 21:03:35
【问题描述】:

在我的代码中我有这个

        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)

知道我应该寻找什么吗?

【问题讨论】:

    标签: android httpclient httpresponse


    【解决方案1】:

    有一些新政策允许应用程序和操作系统开发人员为在某些线程上执行的代码设置性能预期。您尝试在应用程序的 ui 线程上调用阻塞网络 api。 Google 已经建立了一个系统,让您知道这是一个坏主意,您可以通过在单独的线程或 asyncTask 中执行您的请求来解决此问题。

    请阅读this 博文。您可以在 SO 和 Google 上找到有关执行异步/多线程应用程序的信息。

    【讨论】:

    • 感谢您指出博客文章。阅读本文并基于对我的应用程序进行一些重写后,它现在可以工作了。这是 asyncTask 在这方面帮助我。感谢您在这方面的帮助。
    【解决方案2】:

    谢谢尼克。它对我有用。出于开发目的,我只是通过这样做将线程策略设置为默认值

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

    这应该在最终版本中删除。

    【讨论】:

      【解决方案3】:

      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) {
      
          }
      

      是的,这个应该在最终版本中被删除。

      【讨论】:

        【解决方案4】:

        我使用了一个异步任务,在其他线程中看到它,它工作正常......我创建了一个我想调用网络连接的子类。我不知道这是否是最好的方法,但这段代码对我有用....

        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;
                }       
            }
        }
        

        【讨论】:

          猜你喜欢
          • 2011-07-05
          • 1970-01-01
          • 1970-01-01
          • 2011-01-31
          • 2013-04-11
          • 1970-01-01
          • 2011-08-03
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多