【问题标题】:Service Structure, HttpClient Usage, and ANR服务结构、HttpClient 使用情况和 ANR
【发布时间】:2012-02-23 19:58:46
【问题描述】:

好吧,让我解释一下我在做什么,然后我有几个问题。

说明

我正在开发一个应用程序,该应用程序将使用一项服务每隔 1-10 分钟检查一次我的网页是否有更新。所以在 ACTION_BOOT_COMPLETED 上,MyReceiver(Broadcast Receiver) 被触发,如果它是一个 ACTION_BOOT_COMPLETED 广播,它会启动一个名为 BootService 的服务。 BootService 然后设置一个触发 MyReceiver 的 AlarmService,然后 BootService 被终止。当警报广播进入 MyReceiver 时,它会触发另一个名为 UpdateService 的服务,该服务将以 BootService 设置的任何时间间隔检查互联网。

我有一个名为 BootService 的服务,因为每次启动我的应用程序时,它都会启动 BootService 以确保 AlarmService 正在运行,以防万一它因任何原因而终止。

当我发出 HTTPClient 请求时,我希望它受到登录保护,所以我试图做的是每当 BootService 运行时,它都会向我的网站发起 HTTPClient 请求,登录并存储我将使用的会话 ID在更新服务中。但是,当我将 HTTPClient 请求放入 BootService 时,我得到一个 ANR(应用程序无响应)。我尝试将 HTTPClient 请求放入 AsyncTask 中,但仍然存在问题。

问题

  1. 如果我取消 BootService 而是让 MyReceiver 设置一个 AlarmService 会更好吗?每当有人加载应用程序时,就会再次发送广播以启动警报?

  2. 什么可能导致在 HTTPClient 请求期间锁定我的程序并强制执行 ANR 的所有阻塞?我怎样才能正确实现我的 HTTPClient 请求,这样它就不会阻止我的服务?

  3. 登录/cookie 存储方法的任何好的示例。以及稍后使用会话 ID 发出未来请求的服务?

【问题讨论】:

    标签: android service asynchronous httpclient


    【解决方案1】:

    当我发出 HTTPClient 请求时,我希望它受到登录保护,所以我试图做的是每当 BootService 运行时,它都会向我的网站发起 HTTPClient 请求,登录并存储我将使用的会话 ID在 UpdateService 中。

    除非 Web 服务允许无限的会话持续时间,否则这项工作可能会很棘手。我建议您在每次更新时登录。

    但是,当我将 HTTPClient 请求放入 BootService 时,我得到了 ANR(应用程序无响应)。

    这意味着您试图在onStartCommand()onCreate()onDestroy()onBind() 中做太多工作。所有这些方法都在主应用程序线程上调用,因此您无法在那里进行大量工作。

    如果我取消 BootService 而是让 MyReceiver 设置一个 AlarmService 会更好吗?

    是的。

    什么可能导致在 HTTPClient 请求期间锁定我的程序并强制执行 ANR?

    网络 I/O 可能很慢。

    我怎样才能正确实现我的 HTTPClient 请求,这样它就不会阻止我的服务?

    使用IntentService 并在onHandleIntent() 中进行网络I/O。

    【讨论】:

    • 我之前遇到了一些问题,IntentService 并不总是被调用...不知道这是怎么回事,但在我的测试中,我每 15 秒发出一次 HTTPClient 请求,所以我只是将其归因于异步队列堆积起来。这意味着其中一个请求没有通过,它正在等待那个请求完成,然后再继续我调用的其余 IntentServices。我将在 HTTPClient 上设置一个超时,这样它不会浪费超过 10 秒,我还将我的时间间隔增加到一分钟,因为我知道我可以可靠地轮询互联网。再次感谢!
    猜你喜欢
    • 2019-10-21
    • 1970-01-01
    • 2011-09-25
    • 1970-01-01
    • 1970-01-01
    • 2012-02-13
    • 2016-12-15
    • 2015-08-08
    • 2020-03-02
    相关资源
    最近更新 更多