如何处理应用程序范围的轮询例程终止?

时间:2013-09-26 19:25:52

标签: android polling activity-lifecycle

我的应用程序中有一种棘手的情况。 我实现了一种每隔60秒与远程服务器联系的机制,以检查新数据是否可用。如果是这样,新数据将显示在应用程序中。到目前为止一切都很好。

我通过以下方式实现了这个机制:

  • 它开始于我的MainActivity的onCreate()方法。
  • 轮询例程在我的MainActivity的onDestroy()方法中停止。

这可以确保只要应用程序正在运行,轮询就会一直处于活动状态。另外,如果我从MainActivity启动另一个Activity,我也希望轮询能够运行。

我的问题:

当我通过后退按钮退出应用程序时,一切正常,轮询停止。但是当我通过 Home-Button退出我的应用程序时,轮询例程仍然存活,因为我的MainActivity的onDestroy()没有被调用,但我希望它停止。

如果我更改了我的代码并停止了我的MainActivity的onPause()方法中的轮询例程,我遇到的问题是,当我启动一个新的Activity时,轮询也会停止。 < / p>

我想要的是什么:

只要我的应用程序(不是我的MainActivity)在前台/用户可见,我希望轮询运行。一旦用户通过从应用程序中的任何位置按下主页按钮退出应用程序,或者通过按下MainActivity中的后退按钮,我希望轮询停止。

其他:

每次切换活动时我也不想重新启动和停止服务。由于我的应用程序的用户会经常切换活动,这只会是很多开销。此外,我希望“刷新”周期正好是60秒。当我总是重新启动服务并再次停止服务时,我无法保证。它需要在应用程序启动时启动一次,并在应用程序不再处于前台时停止。

如何实现?

当应用程序处于前台以及隐藏/关闭时,是否有某种简单的方法可以检查?

这是我的singelton-polling机制:

private Timer t;
private static Updater instance;

protected Updater() {
      // Exists only to defeat instantiation.
}

public static Updater getInstance() {

    if(instance == null) {
        instance = new Updater();
    }

    return instance;
}

public void startPollingRoutine(int interval, int delay) {      

    t = new Timer();

    // Set the schedule function and rate
    t.scheduleAtFixedRate(new TimerTask() {

        @Override
        public void run() {

            update(); // some asynctask that does the updating
        }

    }, delay, interval);
}

public static void stopPollingRoutine() {
    t.cancel();
}

在代码中:

Updater.getInstance().startPollingRoutine(60000, 0);
Updater.getInstance().stopPollingRoutine();

4 个答案:

答案 0 :(得分:4)

我认为如何处理它的最佳方法是创建一些所有活动都将扩展的BaseActivity。并在onResume / onPause中执行此操作。或者您可以尝试使用服务。

答案 1 :(得分:1)

你需要创建一个服务并在你的主类中触发它将触发服务,除非你在destroy上明确地停止它意味着onBackpressed()/ onDetroy()并让它在onPause()方法中运行

答案 2 :(得分:1)

使用单例,让它有一个计数器变量。发送意图以开始新活动时增加它,并在onPause中减少它。 你可以判断民意调查是否必须停止;当单身人士的计数器为零时。

答案 3 :(得分:0)

谢谢大家的帮助和时间。 我终于找到了满足我所有要求的解决方案。

我按照本教程使其工作: http://www.mjbshaw.com/2012/12/determining-if-your-android-application.html

基本的想法是将Application类和保持引用扩展到特定时间有多少活动“活着”。