Android:在服务中使用网络

Teo*_*ald 10 service networking android

在我的Android应用程序的Service类中调用REST WebService会创建NetworkOnMainThreadException.

我理解为什么在Activity中引发这个异常:同步通过网络获取内容是一种非常糟糕的做法,但我很惊讶在服务类中看到同样的错误.所以我的问题是:

- 在这种特殊情况下,我应该使用StrictMode.setThreadPolicy()这个来电.(对于那些因为在活动中遇到此错误而读取此内容的人,请不要使用StrictMode来隐藏此错误,请使用AsyncTask)

- 或者我应该使用AsyncTask?在那种情况下,这里的问题是什么?线程上的服务不是与Activity分开的吗?

Tom*_*mik 15

即使Service用于后台处理,它们也在主线程中运行.

文档中的简短引用:

警告:默认情况下,服务在与声明它的应用程序相同的进程中运行,并在该应用程序的主线程中运行.因此,如果您的服务在用户与同一应用程序中的活动进行交互时执行密集或阻止操作,则该服务将降低活动性能.为避免影响应用程序性能,您应该在服务中启动一个新线程.

"后台处理"意味着服务没有用户界面,即使用户没有直接与应用程序交互,它也可以运行.但默认情况下,所有后台处理仍然在主线程中发生.

那么,如何解决它并摆脱异常呢?正如文档所示,您必须使用后台线程.在您的服务中,您可以AsyncTask直接使用或创建线程.但我想 IntentService可能是最适合您的情况.IntentService处理后台线程中的请求(这是您正在寻找的服务类型).

  • 很好的答案,还有一些材料可以帮助您了解如何有效地使用网络,以确保您的应用程序得到优化。http://developer.att.com/developer/forward.jsp?passedItemId=7200042 (2认同)