android - Android中多个处理程序相互冲突
问题描述
我正在尝试实现某种类型的函数调用,Handler
以便多次调用函数。为此,我使用Alarm Manager
它来启动 Handler。我成功地做到了。
问题是,当 AlarmManager 在特定时间后重复自身时,还会再次创建一个新的句柄,而前一个句柄仍然在这里。
我只想要一个正在创建和调用的处理程序,无论 AlarmManger 重复多少次。
这是我的警报管理器
AlarmManager am =( AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
Intent i = new Intent(context, MyBroadcastReceiver.class);
PendingIntent pi = PendingIntent.getBroadcast(context, 0, i, 0);
am.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(),1000*1, pi);
这是我的班级,我在哪里打电话给 Handler
public class MyBroadcastReceiver extends BroadcastReceiver implements VolleyJsonRespondsListener {
final int delay = 10000; //milliseconds
final Handler handler = new Handler();
Runnable runnable;
@Override
public void onReceive(final Context context, Intent intent) {
Log.e("timeOut", "@"+CommonFunctions.getTime(System.currentTimeMillis()));
runnable=new Runnable() {
@Override
public void run() {
//do something
Log.e("timeInside", "@"+CommonFunctions.getTime(System.currentTimeMillis()));
handler.postDelayed(this, delay);
}
};
handler.postDelayed(runnable, delay);
}
在 Logcat 中,您可以看到有多个处理程序的值相互冲突。我在日志中实现了系统时间并在 Logcat 中显示它。
定位
解决方案
您必须为该进程创建线程和活套,请参阅此代码
public class MyBroadcastReceiver extends BroadcastReceiver {
final int delay = 10000;
final Handler handler = new Handler();
Runnable runnable;
@Override
public void onReceive(Context context, Intent intent) {
runnable=new Runnable() {
@Override
public void run() {
Looper.prepare();
handler.post(new Runnable() {
@Override
public void run() {
//do something
handler.postDelayed(this, delay);
}
});
Looper.loop();
}
};
}}
推荐阅读
- c# - 如何在 OnPropertyChanged 中将其作为字符串参数传递时避免硬编码 WPF MVVM 属性名称
- ruby-on-rails - 使用 devise gem 时是否可以为访问者添加一个页面?
- java - java spring Long[](数组)类型
- facebook - Google Ads 中的 Facebook 归因跟踪模板
- django - 为什么可以“多种方式”导入UpdateView
- javascript - 通过单击复选框(Vue.js)切换 div
- php - 提交按钮已被点击
- angular - Angular 6:使用延迟加载在同一页面上加载多个模块
- javascript - for 循环行为“TypeError:无法读取未定义的属性‘长度’”
- python - 如何通过套接字输入将 shell 命令转换为 json 序列化数据。例如:json.dumps 和 json.loads python 3x