【问题标题】:Multiple Handlers are conflicting with each other in AndroidAndroid中多个处理程序相互冲突
【发布时间】:2019-09-17 13:14:36
【问题描述】:

我正在尝试在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 中显示。

定位

【问题讨论】:

    标签: android alarmmanager handle


    【解决方案1】:

    这是因为在 Broadcast 的不同实例创建过程中。它由具有未决意图的系统处理,因此您只需要将 Handler 注释为静态对象。这将确保只创建一个处理程序。请注意,此处理程序将绑定到主线程,因为它将使用当前的Looper

    static final Handler handler = new Handler();
    

    【讨论】:

    • @IrfanAkram 否则你的问题就错了。您尝试创建长期存在的单个对象实例,为此您必须使用服务。例如。使用 Handler 的单个实例在 Broadcast 上创建并启动 Service
    【解决方案2】:

    您必须为该进程创建线程和循环器,请参阅此代码

    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();
            }
        };
    }}
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-31
      • 1970-01-01
      • 2019-08-07
      相关资源
      最近更新 更多