在服务中使用哪种延迟执行方法:handler.postdelayed或Alarmmanager。 什么是赞成和缺点。
我有2个服务(a)进行后台处理并通过boradcast消息更新UI (b)每隔5秒做一些计算并更新主屏幕小部件。
由于
答案 0 :(得分:2)
我在Android Developer的网站上找到了这个说明:
http://developer.android.com/training/scheduling/alarms.html
似乎AlarmManager将是用于启动服务的类。
关于处理程序,它声明:
"对于保证在应用程序生命周期内发生的计时操作,请考虑将Handler类与Timer和Thread结合使用。这种方法使Android能够更好地控制系统资源。"
答案 1 :(得分:0)
base64
和AlarmManager
之间的差异Handler
即使在设备处于睡眠模式但处理程序不会运行时也会运行。需要考虑的另一点是AlarmManager
会消耗更多的电池,因为它会唤醒CPU和其他芯片。
我理解你的问题,即使设备处于睡眠模式,你也必须做一些后台任务,你必须使用AlarmManager。尽量保持持续时间尽可能小,这样就不会耗尽电池。您可以AlarmManager
使用InExact()
类型警报启动闹钟。
您可以查看以下链接以供参考。
答案 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);