在单独的进程中的服务中出现android.os.NetworkOnMainThreadException异常

5
在ICS上,当使用UrlConnection时,我遇到了android.os.NetworkOnMainThreadException错误 - 即使我在一个独立进程的服务中进行此请求,并通过Messenger异步调用以完成它。更改StrictPolicy没有效果,我仍然会收到错误。我该怎么办?编辑:此服务在单独的进程中运行 - 具有不同的pid和所有内容。
2个回答

4
根据文档,服务仍然在主线程上运行:
请注意,像其他应用程序对象一样,服务在其托管进程的主线程上运行。这意味着,如果您的服务将执行任何CPU密集型(例如MP3播放)或阻塞(例如网络)操作,则应在其自己的线程中生成该工作线程。有关此内容的更多信息,请参见“进程和线程”。IntentService类可用作Service的标准实现,其具有自己的线程,在其中调度要完成的工作。
因此,对于长时间运行的任务(例如使用UrlConnection),您应该使用诸如IntentService之类的东西,或者自己生成一个新线程。

2
此服务在单独的进程中运行。 - Vadim Peretokin
无论它是否在单独的进程中运行,与您的其他活动或服务分开 - 在服务中直接运行的任何代码仍将在该进程的主线程中执行。如果您改用IntentService,则onHandleIntent()中执行的代码将自动为您创建一个新线程。 - AdamK
那么你的意思是,一个任务在服务的计时器中运行,而该服务与主进程完全分离 - 这将影响主进程的UI线程?我没有注意到这种行为,我的UI在进行网络操作时不会冻结... - Vadim Peretokin
1
不,它不会影响主进程的 UI 线程。它有自己独立的“主”线程 - 由于这个单独的进程没有 UI,因此它不会对用户看到的任何内容产生负面影响。然而,在该线程上访问网络仍将触发您所看到的异常 - 如果您针对 HC+,则不允许在任何进程的主线程上进行网络操作(请参见 http://developer.android.com/reference/android/os/NetworkOnMainThreadException.html)。 - AdamK
好的,谢谢你花时间解释。我想我会把每个放进一个线程里,这样就可以异步完成它们了。 - Vadim Peretokin
我记得 Timer 需要一个参数来在守护进程模式下运行 - 之前我没有打开。我猜这样做可以消除警告。 - Vadim Peretokin

0
在一个 Thread 中处理网络相关的操作。这个异常被抛出是为了防止一些问题,比如 UI 冻结(因为网络任务可能需要时间)。

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