服务结构,HttpClient用法和ANR

时间:2012-02-23 19:58:46

标签: android service asynchronous httpclient

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

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来进行未来的请求吗?

1 个答案:

答案 0 :(得分:0)

  

当我发出我的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.