好吧,让我解释一下我在做什么然后我有几个问题。
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中,但我仍然遇到问题。
问题
如果我取消了BootService,而只是让MyReceiver设置了一个AlarmService,那会更好吗?每当有人加载应用程序时,只是发出一个广播来启动闹钟,再次?
在HTTPClient请求期间阻止我的程序并强制进行ANR会导致所有阻塞的原因是什么?我怎样才能正确实现我的HTTPClient请求,以便它不会阻止我的服务?
登录/ cookie存储方法的任何好例子。以后的服务会使用会话ID来进行未来的请求吗?
答案 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.