服务结构、HttpClient使用和ANR



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

呼气

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

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

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

问题

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

  2. HTTPClient请求锁定我的程序并强制ANR时,是什么原因导致了所有的阻塞?我如何正确地实现HTTPClient请求,使其不会阻碍我的服务?

  3. 登录/cookie存储方法的任何好例子。以后使用会话id进行未来请求的服务?

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

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

然而,当我将HTTPClient请求放入BootService时,我会得到一个ANR(应用程序未响应)。

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

如果我取消BootService,让MyReceiver设置一个AlarmService会更好吗。

是的。

HTTPClient请求锁定我的程序并强制ANR时,是什么原因导致了所有的阻塞?

网络I/O可能很慢。

我如何正确地实现HTTPClient请求,使其不会阻碍我的服务?

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

最新更新