2016-12-06 128 views
0

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

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

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

(编辑:标记为重复之前,请先阅读整个问题谢谢)

+0

即使你启动一个服务多次,届时会有1这样的先例,所以你并不需要担心的 – HendraWD

+0

可能的复制【如何调用Android的延迟后一种方法]( http://stackoverflow.com/questions/3072173/how-to-call-a-method-after-a-delay-in-android) –

+0

@NicRobertson不,这不是一个延迟,因为要求5秒的时间流逝并且如果用户再次按下按钮,则不应该开始服务。 –

回答

0

您可以使用处理后与延迟来实现自己的目标。使您的按钮禁用并在启动您的服务5秒后启用它。您可以执行以下代码:

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秒后启动您的服务。

+0

它发生的情况是用户在5秒的时间间隔内点击了按钮,服务不应该启动(这是通过禁用按钮无法实现的)。 –

+0

@SiddharthSharma看看按钮在5秒内是否被禁用,唯一启动服务的方法是点击按钮,如果按钮不接受任何点击,如何启动服务?试着了解流程。我认为上面的代码将完成您的工作。 –

+0

问题是我不想禁用按钮。点击按钮和启动服务之间的距离只有5秒。如果再次点击按钮,则不启动服务(时间<5秒)或服务停止(时间> 5秒)。 –

0

我会使用类似于以下的util类。将它以可运行的方式传递,并以毫秒为单位延迟,您可以在其运行之前调用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(); 
    } 
} 
0

可以使用Handler.postDelayed功能在Android的环境延迟动作(比计划Java方法)

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 */); 

或者简单的使用,您可以查看功能(工作同上):

your_view.postDelayed(new Runnable() { 
    @Override 
    public void run() { 
     //start your service 
    } 
}, 5000 /* 5s * 1000ms */); 
0

线程可以在后台线程中安排将来执行的任务。任务可能被安排为一次执行,或者定期重复执行。void schedule(TimerTask task,long delay)在指定的延迟后安排指定的任务执行。

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

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

     } 
    },5000); 
+3

请添加描述以描述您发布的代码块。它使社区和OP更容易理解你所问的内容。 –

+0

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

+0

如果您编辑了您的帖子,将您刚刚发布的描述添加为评论,那将会很棒。 –