2012-12-18 182 views
1

我有一个基于拉的应用程序,必须每隔15秒从服务器拉出。对于我用正常的AsyncTask,我的代码基本上是这样的:AsyncTask随机停止

protected Void doInBackground(Context... arg0) { 
    while (true && this.pull_on) { 
    pull_data(); 
    TimeUnit.SECONDS.sleep(15) 
}; 

现在我有,应用程序只是停止拉出蓝色的大问题。 No exeptions,AsyncTask的状态是'正在运行','pull_on'变量被设置为'true',但它只是停止拉动。

我可以not reproduce这个,它只是有时会发生,我可以长时间工作完美,然后它就停止。

有没有人有这样的想法?

我应该用计时器来重构和实现它吗?

使用服务还有什么好处,而我知道的是什么?电池电量不是问题。

感谢您的帮助。

P.S.我应该补充一点,有时我会从AsyncTask开始创建Activity。像这样'ApplicationManager.getCurrentActivity()。startActivity(myIntent)',但我没有缝成一个问题。

P.P.S.

定时器接缝限制为我想使用,我确实想每15秒做一次,但在某些特殊情况下,我想停止ping并重新启动它。对于这些接缝的黑客攻击量更多,然后只需使用AsyncTask即可完成。

+0

当任务停止拉,看看发生了什么事情你可以做一个线程转储。你在做什么pull_data()? – ben75

+0

我得到一个JSON,这取决于我收到什么消息我要么开始一个活动,更新数据库中的东西,或者如果应用程序在后台我创建一个通知。 – nickik

回答

1

这是一个可怕的设计。您不希望每15秒在背景上出现无限循环。作为主要问题之一,当应用程序被推到背景时,这会耗尽电池。

一个正确的方法是发出警报并对此做出反应。计时器也不错。

我建议你看看这个移动的服务,这是什么样子

服务是一个可以在后台执行长时间运行的操作,并且不提供用户界面的应用组件

它讨论的是长时间运行的操作,但经常性操作也有意义转移到服务中。

正式文件上的服务是在这里:http://developer.android.com/guide/components/services.html

+0

电池是不是一个问题,因为该应用程序是为驱动器和手机插入。所以你会建议在服务计时器? – nickik

+0

来自他们的文档:注意:Alarm Manager适用于您希望在特定时间运行应用程序代码的情况,即使您的应用程序当前未在运行。对于正常的定时操作(滴答,超时等),使用Handler更容易,效率更高。 – shalafi

+0

我相信你可以用无限循环建立一个服务。只要确保该服务是解除绑定的,并且该服务被取消/取消绑定时该循环退出。 – shalafi