我有一个按钮(比如活动1),点击它应该启动一个服务(例如,服务1)时。但服务启动前必须延迟5秒。我在服务的onStartCommand中使用SystemClock.sleep(5000)实现了这一点。这工作正常。的Android按钮单击处理程序
现在我想添加的功能,如果再次点击按钮(即使在5秒结束之前),该服务将不会启动。
任何想法如何做到这一点?
(编辑:标记为重复之前,请先阅读整个问题谢谢)
我有一个按钮(比如活动1),点击它应该启动一个服务(例如,服务1)时。但服务启动前必须延迟5秒。我在服务的onStartCommand中使用SystemClock.sleep(5000)实现了这一点。这工作正常。的Android按钮单击处理程序
现在我想添加的功能,如果再次点击按钮(即使在5秒结束之前),该服务将不会启动。
任何想法如何做到这一点?
(编辑:标记为重复之前,请先阅读整个问题谢谢)
您可以使用处理后与延迟来实现自己的目标。使您的按钮禁用并在启动您的服务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秒后启动您的服务。
它发生的情况是用户在5秒的时间间隔内点击了按钮,服务不应该启动(这是通过禁用按钮无法实现的)。 –
@SiddharthSharma看看按钮在5秒内是否被禁用,唯一启动服务的方法是点击按钮,如果按钮不接受任何点击,如何启动服务?试着了解流程。我认为上面的代码将完成您的工作。 –
问题是我不想禁用按钮。点击按钮和启动服务之间的距离只有5秒。如果再次点击按钮,则不启动服务(时间<5秒)或服务停止(时间> 5秒)。 –
我会使用类似于以下的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();
}
}
可以使用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 */);
线程可以在后台线程中安排将来执行的任务。任务可能被安排为一次执行,或者定期重复执行。void schedule(TimerTask task,long delay)在指定的延迟后安排指定的任务执行。
new Timer().schedule(new TimerTask() {
@Override
public void run() {
alertDialog.dismiss();
startActivity(new Intent(****.this,*********.class));
}
},5000);
请添加描述以描述您发布的代码块。它使社区和OP更容易理解你所问的内容。 –
用于线程的工具,用于在后台线程中计划将来执行的任务。任务可以安排为一次执行,或者定期重复执行。 void schedule(TimerTask任务,长延迟) 在指定的延迟后计划指定的任务执行。 – Mallikarjuna
如果您编辑了您的帖子,将您刚刚发布的描述添加为评论,那将会很棒。 –
即使你启动一个服务多次,届时会有1这样的先例,所以你并不需要担心的 – HendraWD
可能的复制【如何调用Android的延迟后一种方法]( http://stackoverflow.com/questions/3072173/how-to-call-a-method-after-a-delay-in-android) –
@NicRobertson不,这不是一个延迟,因为要求5秒的时间流逝并且如果用户再次按下按钮,则不应该开始服务。 –