【问题标题】:Quick fix for NetworkOnMainThreadExceptionNetworkOnMainThreadException 的快速修复
【发布时间】:2012-09-20 23:35:05
【问题描述】:

我需要执行第三方开源程序,抛出NetworkOnMainThreadException。根据 SDK 参考,这仅适用于针对 Honeycomb SDK 或更高版本的应用程序。允许针对早期 SDK 版本的应用程序在其主事件循环线程上进行联网。

在第一阶段,我只想运行程序,而不更改源。因此,我将 AndroidManifesr.xml 中的行从:

安卓:targetSdkVersion="15"

到:

安卓:targetSdkVersion="10"

但是,这并没有帮助,程序仍然抛出 NetworkOnMainThreadException。我怎样才能使它起作用?我正在尝试在 Android Emulation Google API(16 级)上执行该程序。

【问题讨论】:

  • 使用 asyncTask.. 它会移除 NetworkOnMainThreadException

标签: android network-programming networkonmainthread


【解决方案1】:

这些不是解决方案,你只是告诉监护人睡觉和窗台! android 决定不让您在主线程(UI 线程)中进行网络操作,因为这些操作可以使“停止”(ui 停止响应)。 所以,正如我所读到的,他们告诉你不要射你的腿,你会找到方法!!!

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

【讨论】:

  • 事实上,在某些情况下,您希望或需要使用主线程进行网络操作。一个例子:当你的主线程抛出一个未捕获的异常时发送一个崩溃报告。如果要将其发送到远程服务器进行日志记录,则不能启动一个新线程并期望该线程能够存活足够长的时间来发送日志而不会阻塞主线程。我敢肯定还有其他情况。
  • 很清楚也不复杂,文档告诉你不应该在主线程中进行网络操作。我的回答没有错,那为什么-1 ??只是因为你想象在 main 中需要网络的设置??
  • EsmaeelQuash,说其他回复“不是解决方案”是无效的声明。这就是为什么 -1.The other 解决方案实际上是您需要的情况下的正确解决方案。不建议在主线程上进行网络活动,但这并不意味着没有正当理由需要有效的解决方案。
  • 好的,我的意思是,如果操作系统拒绝这样做(主要网络),这意味着不建议转身做。程序员告诉操作系统他正在使用以前的版本作为目标,让他进行“非法”操作!!!这是解决方案吗?我告诉了正确的方法(分开的线程)。但如果有必要在 main 中做网络,这是另一个问题。
【解决方案2】:

您正在 UI 线程上执行网络任务。执行网络操作的最佳方式是使用 AsyncTask 或简单地创建另一个线程。但是,如果您想要一种快速而肮脏的方法来摆脱错误;你也可以用这个

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

【讨论】:

  • 这比接受的答案中的其他“setThreadPolicy”选项更干净,这正是我所需要的。事实上,在某些情况下需要主线程上的网络,我的特殊情况是向服务器发送崩溃报告。
【解决方案3】:

你可以改成:

android:targetSdkVersion="9"

API 10 对应蜂窝,而 9 是姜饼。此行为仅在 API 10 及更高版本中可见。

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

您也可以尝试使用以下方法关闭严格模式:

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

【讨论】:

  • 我同意这是一个糟糕的解决方法,但它确实确定了为什么当我更新旧项目时突然开始发生这种情况。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多