【问题标题】:postDelayed OnClickListener is not workingpostDelayed OnClickListener 不工作
【发布时间】:2018-01-14 07:50:42
【问题描述】:

我正在尝试实现按钮单击延迟,每秒我需要从名为solved_cells 的列表中删除一个项目,该列表最初有 16 个项目。以下是我所做的:

solve_all.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

                   while (solved_cells.size()>=1) {
                       v.postDelayed(new Runnable() {
                           @Override
                           public void run() {
                               //Execute code here
                        solved_cells.remove(solved_cells.size() - 1);
                          }
                       }, 1000L);

                    }
        }
    });

但每次调试时,我都会看到代码到达:

v.postDelayed(new Runnable() {

并且不涉及public void run() { 功能,非常感谢您的建议。

【问题讨论】:

  • postDelayed 只是将Runnable 放入队列以供稍后执行,它不会立即运行它。这会将您的while 变成一个无限循环。

标签: android onclicklistener timedelay postdelayed


【解决方案1】:

我不知道你的代码到底有什么问题,但你可以通过创建 TimerTask 类来使用计时器来代替

   Timer timer;
   MyTimerTask timerTask;
private class MyTimerTask extends TimerTask {

    @Override
    public void run() {
        try {
            activity.runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    if (solved_cells.size() > 0) {
                        solved_cells.remove(solved_cells.size() - 1);
                    } else {

                        timer.cancel();
                        timer.purge();
                    }
                }
            });
        } catch (Exception e) {
            // e.printStackTrace();
        }
    }
}

在你的监听器中你可以这样声明它

solve_all.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
      timerTask = new MyTimerTask();
      Timer t = new Timer();
      t.schedule(timerTask , 1000L);

    }
});

【讨论】:

  • 谢谢,但同样的问题。您的代码仅从列表中删除一项。当像这样实现 while 循环时 'public void onClick(View v) {while (solved_cells.size() >= 1) { timerTask = new MyTimerTask();定时器 t = new Timer(); t.schedule(timerTask , 1000L); }}' 那么'run()' 函数不会被调用。
  • 我需要删除所有项目,每秒一个一个。
  • 感谢 Mosa,我编辑了您的答案以调用计时器,现在它正在工作。 ' 覆盖 public void run() { if (Game.solved_cells.size() > 0) { int yyy = cells.get(solved_cells.get(solved_cells.size() - 1)); Game.solved_cells.remove(Game.solved_cells.size() - 1); timerTask = new MyTimerTask();定时器 t = new Timer(); t.schedule(timerTask, 1000L);'
  • 这必须每秒删除一个项目,直到没有项目为止
  • 好的很高兴这个解决方案对你有用,如果它工作正常,请接受答案并投票
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多