NetworkOnMainThreadException的快速修复方法

9
我需要执行第三方开源程序,但是该程序会抛出 NetworkOnMainThreadException 异常。根据 SDK 的参考资料,只有面向 Honeycomb SDK 或更高版本的应用程序才会引发此异常。而面向早期 SDK 版本的应用程序允许在主事件循环线程上进行网络操作。
在第一阶段中,我只想运行程序,而不修改源代码。因此,我将 AndroidManifesr.xml 文件中的以下行从:
android:targetSdkVersion="15"
改为:
android:targetSdkVersion="10"
然而,这并没有帮助,程序仍然抛出 NetworkOnMainThreadException 异常。我正在尝试在 Android Emulation Google APIs (level 16) 上执行该程序,请问如何使其正常工作?

使用asyncTask,它将消除NetworkOnMainThreadException。 - Rahul Baradia
3个回答

22

您可以将其更改为:

android:targetSdkVersion="9"

API 10对应着蜂巢(Honeycomb),而9对应着姜饼(Gingerbread)。这种行为只在API 10及以上版本中出现。

然而,我不建议这样做。相反,您应该将任何长时间运行的操作或可能长时间运行的操作移动到后台线程,例如AsyncTask

您还可以尝试使用以下方式关闭Strict Mode:

    StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
    StrictMode.setThreadPolicy(policy);

1
我同意这是一个不好的解决方法,但它确实确定了为什么在我更新一个旧项目后突然开始出现这种情况。 - RevNoah

4

您正在UI线程上执行网络任务。最好的方法是使用AsyncTask或者简单地创建另一个线程来执行网络操作。但是,如果想要一种快速而且简便的方法来消除错误,也可以使用以下方式:

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

这比接受的答案中的其他“setThreadPolicy”选项更清晰,正是我所需要的。实际上,有时确实需要在主线程上进行网络操作,而我特别需要将崩溃报告发送到服务器。 - Josh

0

这些不是解决方案,你只是让监护人睡觉和发呆!!! Android决定不允许您在主线程(UI线程)中进行网络操作,因为这些操作可能会导致“停顿”,从而使UI停止响应。 所以,正如我所读到的,他们告诉你不要自断后路,而你要找到方法去做!!!

解决方案:分离线程或异步...


1
实际上,有时您需要使用主线程进行网络操作。一个例子是:当您的主线程抛出未捕获的异常时,发送崩溃报告。如果您想将其发送到远程服务器进行日志记录,则无法启动新线程并期望该线程足够长时间存活以在主线程上阻塞而不发送日志。我相信还有其他情况。 - Josh
文档明确指出不应在主线程中进行网络操作,这一点很清楚且不复杂。我的回答并没有错,那为什么会有负一分的评价?只是因为你想象了需要在主线程中进行网络操作的情况吗? - EsmaeelQash
EsmaeelQuash,说其他回复“不是解决方案”是无效的陈述。这就是为什么会出现-1。其他解决方案实际上是正确的解决方案,适用于需要此功能的情况。虽然不建议在主线程上进行网络活动,但这并不意味着没有需要有效解决方案的有效原因。 - Josh
好的,我的意思是,如果操作系统拒绝这样做(在主线程中进行网络操作),那就意味着不建议绕过去执行。程序员告诉操作系统他正在使用以前的版本作为目标,让它执行“非法”操作!这是解决方案吗?我会告诉你正确的方法(使用独立的线程)。但是如果确实有必要在主线程中进行网络操作,那是另外一个问题。 - EsmaeelQash

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接