Android按钮单击处理程序

时间:2016-12-06 02:35:33

标签: android button sleep thread-sleep

我有一个按钮(比如活动1),点击它时应该启动服务(例如服务1)。但是在服务开始之前必须有5秒的延迟。我在服务的onStartCommand中使用SystemClock.sleep(5000)实现了这一点。这工作正常。

现在我想添加一个功能,如果再次点击按钮(甚至在5秒结束之前),服务将不会启动。

任何想法如何做到这一点?

(编辑:请在将其标记为重复之前阅读整个问题。谢谢)

4 个答案:

答案 0 :(得分:0)

您可以使用延迟发布的处理程序来实现您的目标。使您的按钮禁用并在五秒钟后启用它并启动您的服务。您可以实现以下代码:

button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                button.setEnabled(false);
                new Handler().postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        //start your service here
                        button.setEnabled(true);
                    }
                }, 5000);
            }
        });

以上代码将禁用您的按钮5秒钟,并在5秒后启动您的服务。

答案 1 :(得分:0)

我使用类似于以下的util类。将它传递给一个可运行的和一个ms的延迟,你可以在它运行之前调用stop()来取消它。如果要重新启动计时器,也可以呼叫restart()。我将它用于沉浸式视图中的自动显示/隐藏控件之类的东西。

public class DelayableRunnable{

  int mDelay = 0;
  Handler mHandler = new Handler();
  Runnable mRunnable;
  boolean mIsRunning = false;

  public DelayableRunnable(Runnable runnable, int delay){
      mRunnable = runnable;
      mDelay = delay;
  }

  public void setNewDelay(int delay){
      mDelay = delay;
  }

  public void start(){
      if(mIsRunning) {
          stop();
      }
      mHandler.postDelayed(mRunnable, mDelay);
      mIsRunning = true;
  }

  public void stop(){
      mHandler.removeCallbacks(mRunnable);
      mIsRunning = false;
  }

  public void restart(){
      stop();
      start();
  }
}

答案 2 :(得分:0)

您可以在Android环境中使用nombre功能进行延迟操作(优于计划java方法)

Handler.postDelayed

或者更简单地使用您查看功能(与上面相同):

final Handler handler = new Handler(); // or use existed one your_view.getHandler()
handler.postDelayed(new Runnable() {
    @Override
    public void run() {
        //start your service
    }
}, 5000 /* 5s * 1000ms */);

答案 3 :(得分:0)

线程的工具,用于在后台线程中安排将来执行的任务。任务可以安排为一次性执行,或者定期重复执行void schedule(TimerTask任务,长延迟)在指定的延迟后安排指定的任务执行。

 new Timer().schedule(new TimerTask() {
        @Override
        public void run() {

            alertDialog.dismiss();
            startActivity(new Intent(****.this,*********.class));

        }
    },5000);