【问题标题】:NetworkOnMainThreadException in Service服务中的 NetworkOnMainThreadException
【发布时间】:2012-02-24 06:24:01
【问题描述】:

我在我的Service 课程中得到了一个NetworkOnMainThreadException,这本质上是没有意义的,因为据我所知,服务是后台进程。

在 Service 方法中,我正在调用静态辅助方法来下载数据。我也在使用 DefaultHttpClient。

这是怎么回事?

【问题讨论】:

  • 您能否展示您的代码以便于调查?
  • 查看我关于 NetworkOnMainThreadException 的帖子。它解释了为什么会发生这种情况。

标签: android networkonmainthread


【解决方案1】:

我只是用这个来解决这个问题:

public int onStartCommand(Intent intent, int flags, int startId) {

    RefreshDBAsync task = new RefreshDBAsync(this);
    task.execute();

    return START_STICKY;
}

RefreshDBAsync 每 5 分钟向服务器发出一次请求

【讨论】:

    【解决方案2】:

    当应用程序尝试执行 在其主线程上进行网络操作。

    这仅针对以 Honeycomb SDK 为目标的应用程序或 更高。允许针对早期 SDK 版本的应用程序执行 在他们的主事件循环线程上联网,但它很重 气馁。

    http://developer.android.com/reference/android/os/NetworkOnMainThreadException.html

    【讨论】:

      【解决方案3】:

      onStartCommand()Service 中的 UI 线程上运行。尝试使用IntentService,或者使用ServiceHandler/RunnableAsyncTask)中的任何其他线程方法。

      【讨论】:

      • 不允许在服务中调用 AsyncTask,因为它应该从主线程执行,对吗?
      • @bgplaya 你绝对可以在Service 中使用AsyncTask。正如我上面所说,常规的Service 在主(UI)线程上运行。
      • 我应该检查我的代码,但似乎我在 Service 中使用 AsyncTask 时遇到了麻烦:也许我只是在 onStartCommand() 中没有调用它
      【解决方案4】:

      服务回调都在主线程上运行,也就是 UI 线程。如果你想做后台工作,要么启动一个线程,要么使用 IntentService 的 onHandleIntent(Intent i)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-09-07
        • 2013-03-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多