首页 > 解决方案 > 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 中显示它。

定位

在此处输入图像描述

标签: androidalarmmanagerhandle

解决方案


您必须为该进程创建线程和活套,请参阅此代码

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

推荐阅读