服务结构,HttpClient的使用和ANR

问题描述:

好吧,让我解释我在做什么,然后我有几个问题。服务结构,HttpClient的使用和ANR

Explination

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

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

当我提出HTTPClient请求时,我希望它被登录保护,所以我试图做的是无论何时运行BootService,它都会向我的网站发起HTTPClient请求,登录并存储会话ID,在UpdateService中使用。但是,当我将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。

+0

我现在就试试这个。请等候。 – Rawr 2012-02-24 21:55:30

+0

我之前遇到了一些问题,IntentService并不总是被调用......不知道是怎么回事,但在测试期间,我每隔15秒就发出一次HTTPClient请求,所以我只是将它归因于异步队列。这意味着其中一个请求没有通过,并且在继续执行我称为的其他IntentServices之前,它正在等待该请求完成。我会在HTTPClient上设置一个超时时间,所以它不会浪费超过10秒钟,而且我也将时间间隔增加到一分钟,因为我知道我可以可靠地轮询互联网。再次感谢! – Rawr 2012-02-25 01:20:59