2016-12-06 194 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

如果您編輯了您的帖子,將您剛剛發佈的描述添加爲評論,那將會很棒。 –