用于重复任务的Android处理程序 - 它会重叠吗?定时器任务VS处理程序VS警报管理器

时间:2014-10-04 07:36:50

标签: java android alarmmanager timertask android-handler

我正在尝试构建一个Android应用,每隔10分钟重复运行一次。 我发现Handlers比定时器或调度更可靠。所以我将使用Handlers使用下面给出的代码开发我的应用程序。

我有点担心以下代码会在每次启动应用时创建单独的Handlers并保持它们并行运行,可能是因为我在{Handler上创建onCreate 1}}。

那么一次只在后台运行一次Handler运行的最佳方法是什么?

private Handler handler;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    handler = new Handler(); // new handler
    handler.postDelayed(runnable, 1000*60*10); // 10 mins int.
    setContentView(R.layout.activity_pro__sms);
} 

private Runnable runnable = new Runnable() {
    @Override
    public void run() {
        /* my set of codes for repeated work */
        foobar();
        handler.postDelayed(this, 1000*60*10); // reschedule the handler
    }
};

3 个答案:

答案 0 :(得分:5)

您可以扩展Application类并在其中完成工作。

public class App extends Application {

    private Handler handler;

    @Override
    protected void onCreate() {
        super.onCreate();
        handler = new Handler(); // new handler
        handler.postDelayed(runnable, 1000*60*10); // 10 mins int.
        setContentView(R.layout.activity_pro__sms);
    } 

    private Runnable runnable = new Runnable() {
        @Override
        public void run() {
            /* my set of codes for repeated work */
            foobar();
            handler.postDelayed(this, 1000*60*10); // reschedule the handler
        }
    };
}

在清单中声明你的课程:

<application android:name=".App">

<强>被修改

但它仅在您的应用运行时才有效,否则您可以使用AlarmManager

答案 1 :(得分:4)

我决定回答我自己的问题,因为我已经找到了正确的方法。 Android的方式。首先,我试图做的并在问题中发布是对我的要求的错误方法。现在我发布这个,这样其他人就不会这样做,但方法如下。

Android几乎没有时间选择。

  1. 计时器任务 - &gt;应用程序运行时运行。最适合短期计时。资源使用率更高。

  2. 处理程序 - &gt;应用程序运行时运行。但不适合用作调度程序。 (这就是我所问的,这不是正确的方法)。 Handlers是在应用程序被杀之前反复执行某些操作的最佳方式。

  3. 警报管理器 - &gt;即使应用程序被杀,也是计划将来发生事情的最佳方式。 (这是我应该申请的应用程序)。
  4. 这就是我想到的。如果我错了,请纠正我。

答案 2 :(得分:0)

首先定义一个实用程序类

public abstract class HandlerPeriodRunnable implements Runnable {

    private Handler periodHandler;
    private int msPeriod;

    public HandlerPeriodRunnable(Handler periodHandler, int msPeriod) {
        this.periodHandler = periodHandler;
        this.msPeriod = msPeriod;
    }

    @Override
    public void run() {
        periodRun();
        if (msPeriod > 0) {
            periodHandler.postDelayed(this, msPeriod);
        }
    }

    abstract public void periodRun();
}

然后使用它

final Handler mUIHandler = new Handler();

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    mUIHandler.postDelayed(new HandlerPeriodRunnable(mUIHandler, 1000) {
        @Override
        public void periodRun() {

        }
    }, 2000);
}