Android处理程序:处理程序未按预期工作

Android处理程序:处理程序未按预期工作,android,handler,Android,Handler,我有一个按钮名btnOk,在这个按钮内我有一个普通的方法 我的想法是,经过一段时间间隔后,此按钮内的方法将自动执行 @Override protected void onCreate(Bundle savedInstanceState) { //Do something value(); //Create handler final Handler handler = new Handler(); //Run method automatically after 20s handler.p

我有一个按钮名btnOk,在这个按钮内我有一个普通的方法

我的想法是,经过一段时间间隔后,此按钮内的方法将自动执行

@Override
protected void onCreate(Bundle savedInstanceState) {

//Do something
value();

//Create handler
final Handler handler = new Handler();

//Run method automatically after 20s
handler.postDelayed(new Runnable() {
    @Override
    public void run() {
        // Do something after 5s = 5000ms
        submitResult();
    }
}, 20000);

//Wait for user clicks, 
//must start in 20s or submitResult(); will be executed automatically
btn = (Button) findViewById(R.id.btnOk);
btn.setOnClickListener(new View.OnClickListener() {
    public void onClick(View v) {
        submitResult();
    }
 });


}
因此,我创建了一个处理程序来延迟我的函数。我期望编程工作如下:

逻辑如下:

如果用户未单击按钮,则用户可以在20秒后单击按钮Ok=> button=>运行该方法

我的问题是,每次我运行这个itent时,20秒都算作总数

例如:

  • 从活动A开始,我启动B(确定按钮在B中,用户必须在20秒内单击按钮)
  • 第一次,用户决定单击按钮只需15秒。
  • 之后,我开始活动A(比如循环A=>B=>A=>B…)
  • 同样,从活动A到活动B,这次我希望方法必须在20秒后运行,但只有5秒后才能运行(我猜第一次运行15秒+第二次启动5秒将计为总20秒),它会自动执行

    @Override
    protected void onCreate(Bundle savedInstanceState) {
    
    //Do something
    value();
    
    //Create handler
    final Handler handler = new Handler();
    
    //Run method automatically after 20s
    handler.postDelayed(new Runnable() {
        @Override
        public void run() {
            // Do something after 5s = 5000ms
            submitResult();
        }
    }, 20000);
    
    //Wait for user clicks, 
    //must start in 20s or submitResult(); will be executed automatically
    btn = (Button) findViewById(R.id.btnOk);
    btn.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {
            submitResult();
        }
     });
    
    
    }
    
  • 有人能帮我解决这个问题吗?或者,在一段时间间隔后,自动单击的任何方法


    我真的很感谢你的帮助。提前感谢。

    这将是第一个运行的
    处理程序,而不是新的处理程序(在第二个活动B中创建)。如果用户单击该按钮,则应“取消”处理程序,否则它将运行两次
    submitResult()

    试试这个:

    btn.setOnClickListener(new View.OnClickListener() {
      public void onClick(View v) {
        handler.removeCallbacks(null);
        submitResult();
      }
    });
    

    非常感谢,但它仍然不能作为我的开场白(@ManhNguyenVan确保您将该行添加到了
    OnClickListener
    。这应该可以做到,除非那里发生了其他事情。非常感谢!我更改了实现,因此它现在可以完美地工作。我必须说谢谢您的想法,我在调用计时器后,在一旦单击Listener,我就调用myTimer.cancel()停止计时器。它就像一个符咒。再次感谢你,我的兄弟!