处理程序可运行多次运行

时间:2016-10-03 08:09:43

标签: android runnable android-handler

我的一个班级有两个处理程序,可以定期发送消息。此类在其中一个活动中实例化。以下是代码:

    public class MyClass {

    private Boolean started = false;
    private Handler handler1 = new Handler();
    private Handler handler2 = new Handler();
    private Runnable runnable1 = new Runnable() {
            @Override
            public void run() {
                sendMessage("blah");
            }
        };
    private Runnable runnable2 = new Runnable() {
            @Override
            public void run() {
                sendMessage("blah blah");
                if (started) {
                    triggerMessageSending();
                }
            }
        };
    }

   public void startMessageSending(){
        triggerMessageSending();

    }

    private void triggerMessageSending(){
        started = true;
        handler1.postDelayed(runnable1, 500);
        handler2.postDelayed(runnable2, 1000);
    }

    public void stopMessageSending(){
        started = false;
        handler1.removeCallbacks(runnable1);
        handler2.removeCallbacks(runnable2);
    }

}

这是我的活动:

public class MyActivity extends Activity {

private MyClass myClass;

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        myClass = new MyClass();
        myClass.startMessageSending();

}

 @Override
    protected void onStop() {
        super.onStop();
        myClass.stopMessageSending();
}
}

第一次一切正常。如果我按下后退按钮并转到上一个活动并再次返回(不退出应用程序),则会调用sendMessage方法两次。如果我再做一次,这就变成了三个。在不退出应用程序的情况下,它会在我开始此活动时多次调用该方法。如果我退出应用程序并再次执行此操作,它第一次正常工作。

这是什么原因?我哪里错了?

1 个答案:

答案 0 :(得分:0)

不确定您的业务逻辑,但这些是我在您的代码中可以看到的问题。

  • 如果Runnable正在执行相同的工作(sendMessage),那么有两个runnables有什么意义?
  • 在第二个Runnable runnable2中,同样完成了同样的事情。唯一的区别是boolean started检查哪个触发triggerMessageSending()进行循环

现在MyClass对象启动在onCreate中使用triggerMessageSending()方法完成,该方法启动两个处理程序然后运行

  

注意:onStop()在活动生命周期中可能会或可能不会被调用。检查此link 。一世   意味着它不能保证。执行myClass.stopMessageSending();   onPause()并检查

所以你的消息被调用了两次。