【问题标题】:Handler runnable running multiple times处理程序可运行多次
【发布时间】:2016-10-03 08:09:43
【问题描述】:

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

    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 方法被调用两次。如果我再做一次,这变成三个。它调用该方法的次数与我在不退出应用程序的情况下启动此活动的次数一样多。如果我退出应用程序并再次执行此操作,它第一次可以正常工作。

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

【问题讨论】:

  • 我不确定,但请尝试在onStop() 方法中设置myClass = null;
  • 试过了..不工作
  • 尝试使用static myClass 对象。

标签: android runnable android-handler


【解决方案1】:

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

  • 如果两个 Runnable 都在做同样的工作 ( sendMessage ) 拥有两个可运行文件有什么意义?
  • 在第二个Runnablerunnable2 中,再次执行相同操作。唯一的区别是检查boolean started 会触发triggerMessageSending() 循环

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

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

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

【讨论】:

  • 我想每隔 500 毫秒交替发送消息 A 和消息 B。我怎样才能在 1 个可运行文件中做到这一点?
  • 只需使用布尔变量并在发送消息后对其进行更改。 if(true) sendOne 否则 sendSecond。该变量应该是全局的,而不是处理程序的本地变量。同样,如果调用处理程序,则检查相同的全局变量并发送消息。
猜你喜欢
  • 2015-03-08
  • 1970-01-01
  • 1970-01-01
  • 2015-04-21
  • 1970-01-01
  • 2011-12-12
  • 1970-01-01
  • 2015-07-07
  • 1970-01-01
相关资源
最近更新 更多