AlarmManager与Handler.postDelayed

时间:2013-12-16 04:51:11

标签: android widget android-service alarmmanager android-handler

在服务中使用哪种延迟执行方法:handler.postdelayed或Alarmmanager。 什么是赞成和缺点。

我有2个服务(a)进行后台处理并通过boradcast消息更新UI (b)每隔5秒做一些计算并更新主屏幕小部件。

由于

3 个答案:

答案 0 :(得分:2)

我在Android Developer的网站上找到了这个说明:

http://developer.android.com/training/scheduling/alarms.html

似乎AlarmManager将是用于启动服务的类。

关于处理程序,它声明:

"对于保证在应用程序生命周期内发生的计时操作,请考虑将Handler类与Timer和Thread结合使用。这种方法使Android能够更好地控制系统资源。"

答案 1 :(得分:0)

base64AlarmManager之间的差异Handler即使在设备处于睡眠模式但处理程序不会运行时也会运行。需要考虑的另一点是AlarmManager会消耗更多的电池,因为它会唤醒CPU和其他芯片。

我理解你的问题,即使设备处于睡眠模式,你也必须做一些后台任务,你必须使用AlarmManager。尽量保持持续时间尽可能小,这样就不会耗尽电池。您可以AlarmManager使用InExact()类型警报启动闹钟。

您可以查看以下链接以供参考。

AlarmManager

Best Practices to keep device wake up

答案 2 :(得分:0)

我建议您使用RxJava执行此操作。在几行中,您将能够处理延迟,而不必担心处理程序和取消此操作。如果你必须创建多个处理程序,这也会节省很多时间。

这将创建一个订阅者,当订阅此订阅者的观察者发出某些内容时,将调用intervalSubscriber的onNext()。

// Set up a subscriber once. Setting up the subscriber
private Subscriber<Long> intervalSubscriber = new Subscriber<Long> () {
    @Override
    public void onCompleted() {
        //Wrap up things as onCompleted is called once onNext() is over
    }
    @Override
    public void onError(Throwable e) {
        //Keep an eye open for this. If onCompleted is not called, it means onError has been called. Make sure to override this method
    }
    @Override
    public void onNext(Long aLong) {
        // aLong will be from 0 to 1000
        // Yuor code logic goes here

        // If you want to run this code just once, just add a counter and call onComplete when the counter runs the first time

    }
} 

让我们一起创建将要发出的可观察量。

//Setting up the Observable. This will make runThisOnInterval observable emit every 5 seconds on Computation Threadpool created and managed by RxJava.

private Observable<Long> runThisOnInterval = Observable.interval(5000, TimeUnit.MILLISECONDS, Schedulers.computation());

好的,所以我们现在都准备好了。我们现在需要做的就是让subscriberSubscriber运行ThisOnInterval observable,以便observable可以开始生成并且订阅者可以使用。

subscribe()的简单调用将启动排放,而不是在主线程上完成,这给了我很大的灵活性。

runThisOnInterval.subscribe(intervalSubscriber);