我需要执行第三方开源程序,它会抛出NetworkOnMainThreadException。根据SDK参考,仅针对Honeycomb SDK或更高版本的应用程序进行此操作。针对早期SDK版本的应用程序可以在其主要事件循环线程上进行联网。
在第一阶段我只想运行程序,而不更改源代码。所以,我改变了AndroidManifesr.xml中的行:
android:targetSdkVersion="15"
为:
android:targetSdkVersion="10"
但是,这没有帮助,程序仍然会抛出NetworkOnMainThreadException。我怎样才能使这个工作?我正在尝试在Android Emulation Google API上执行该程序(级别16)。
答案 0 :(得分:20)
您可以将其更改为:
android:targetSdkVersion="9"
API 10对应蜂窝,而9是姜饼。此行为仅在API 10及更高版本中可见。
但是,我会建议不要这样做。相反,您应该将任何长时间运行的操作或可能长时间运行的操作移动到后台线程中,例如AsyncTask。
您还可以尝试使用以下方式设置严格模式:
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);
答案 1 :(得分:3)
您正在UI线程上执行网络任务。执行网络操作的最佳方法是使用AsyncTask或简单地创建另一个线程。但是,如果你想要一个快速而肮脏的方法来摆脱错误;你也可以用这个
ThreadPolicy tp = ThreadPolicy.LAX;
StrictMode.setThreadPolicy(tp);
答案 2 :(得分:0)
这些都不是解决方案,你只需告诉tutelar睡觉和窗台! android决定不让你在主线程(UI线程)中进行网络操作,因为"停止"这些操作可以使(ui停止响应)。 所以,正如我读到的,他们告诉你不要射击你的腿,你找到了办法!!!
解决方案:分离的线程,或者Async ......