我有一個按鈕(比如活動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秒的時間流逝並且如果用戶再次按下按鈕,則不應該開始服務。 –