gpt4 book ai didi

android - handler.postDelayed 对比 AlarmManager 对比

转载 作者:行者123 更新时间:2023-11-29 14:56:29 28 4
gpt4 key购买 nike

我的一个应用程序有一个小问题。它使用 BroadCastReceiver 来检测调用何时结束,然后执行一些小的内务处理任务。这些必须延迟几秒钟,以允许用户查看一些数据并确保通话记录已更新。为此,我目前正在使用 handler.postDelayed():

public class CallEndReceiver extends BroadcastReceiver {

@Override
public void onReceive(final Context context, final Intent intent) {
if (DebugFlags.LOG_OUTGOING)
Log.v("CallState changed "
+ intent.getStringExtra(TelephonyManager.EXTRA_STATE));
if (intent.getStringExtra(TelephonyManager.EXTRA_STATE)
.equalsIgnoreCase(TelephonyManager.EXTRA_STATE_IDLE)) {
SharedPreferences prefs = Utils.getPreferences(context);
if (prefs.getBoolean("auto_cancel_notification", true)) {
if (DebugFlags.LOG_OUTGOING)
Log.v("Posting Handler to remove Notification ");
final Handler mHandler = new Handler();
final Runnable mCancelNotification = new Runnable() {
public void run() {
NotificationManager notificationMgr = (NotificationManager) context
.getSystemService(Service.NOTIFICATION_SERVICE);
notificationMgr.cancel(12443);
if (DebugFlags.LOG_OUTGOING)
Log.v("Removing Notification ");
}
};
mHandler.postDelayed(mCancelNotification, 4000);


}
final Handler updateHandler = new Handler();
final Runnable mUpdate = new Runnable() {
public void run() {
if (DebugFlags.LOG_OUTGOING)
Log.v("Starting updateService");
Intent newBackgroundService = new Intent(context,
CallLogUpdateService.class);
context.startService(newBackgroundService);
}
};
updateHandler.postDelayed(mUpdate, 5000);

if (DebugFlags.TRACE_OUTGOING)
Debug.stopMethodTracing();
try
{
// Stopping old Service
Intent backgroundService = new Intent(context,
NetworkCheckService.class);
context.stopService(backgroundService);
context.unregisterReceiver(this);
}
catch(Exception e)
{
Log.e("Fehler beim Entfernen des Receivers", e);
}
}

}

现在我遇到了问题,这个设置在大约 90% 的时间内都有效。在大约 10% 的情况下,通知不会被删除。我怀疑线程在消息队列处理消息/可运行之前就死了。

我现在正在考虑 postDelayed() 的替代方案,而我的选择之一显然是 AlarmManager。但是,我不确定性能影响(或它使用的资源)。

也许有更好的方法来确保在线程死亡之前所有消息都已被处理,或者有其他方法可以延迟这两位代码的执行。

谢谢

最佳答案

I'm currently using handler.postDelayed() for this purpose:

这不是一个好主意,假设 BroadcastReceiver 是由 list 中的过滤器触发的。

Now I have the problem, that this setup works about 90% of the time. In about 10% of cases, the notification isn't removed. I suspect, that the thread dies before the message queue processes the message/runnable.

更准确地说,进程被终止,所有的东西都被带走。

I'm now thinking about alternatives to postDelayed() and one of my choices is obviously the AlarmManager. However, I'm not sure about the performance impact (or the resources it uses).

没那么糟糕。另一种可能性是在 IntentService 中完成延迟工作——通过调用 startService() 触发——并让它在后台线程中休眠几秒钟.

关于android - handler.postDelayed 对比 AlarmManager 对比,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5504656/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com