在我的代码中,我有这个
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)
知道我应该寻找什么吗?
答案 0 :(得分:32)
有一些新策略允许应用程序和操作系统开发人员为在某些线程上执行的代码设置性能预期。您试图在应用程序的ui线程上调用阻塞网络api。 Google已经建立了一个系统,让您知道这是一个坏主意,您可以通过在单独的线程或asyncTask中执行请求来解决此问题。
请阅读this博文。您可以找到有关在SO和Google上执行异步/多线程应用程序的信息。
答案 1 :(得分:5)
谢谢尼克。它对我有用。出于开发目的,我只需通过执行此操作将线程策略设置为默认值
*ThreadPolicy tp = ThreadPolicy.LAX;
StrictMode.setThreadPolicy(tp);*
最终版本应该删除。
答案 2 :(得分: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) {
}
是的,最终版本应删除 。
答案 3 :(得分:3)
我使用了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;
}
}
}