2016-02-19 27 views
2

我啓動了一個runnnable但未將其分配給變量。我該如何阻止它?我知道這是removeCallbacksAndMessages()方法的組合,但我不知道在傳遞什麼參數,此方法,因爲我創建了一個匿名的可運行:如何從處理程序中刪除未分配給變量的Runnable

mStartButton.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      h = new Handler(); 
      final int delay = 1000; //milliseconds 

      h.postDelayed(new Runnable() { 
       public void run() { 
        mUpdateRef.addListenerForSingleValueEvent(new ValueEventListener() { 
         @Override 
         public void onDataChange(DataSnapshot dataSnapshot) { 
          int mNumberOfPollsForCurrentDay = (int) dataSnapshot.getChildrenCount(); 
          Random r = new Random(); 
          int randomPollInRangeOfCurrentDayNumberOfPolls = r.nextInt((mNumberOfPollsForCurrentDay + 1) - 1) + 1; 
          int numberOfPollAnswersAtRandomNumber = (int) dataSnapshot.child(String.valueOf(randomPollInRangeOfCurrentDayNumberOfPolls)).child(POLL_ANSWERS_LABEL).getChildrenCount(); 
          Random rr = new Random(); 
          int randomAnswerBasedFromRandomPollAnswerChoices = rr.nextInt((numberOfPollAnswersAtRandomNumber + 1) - 1) + 1; 
          mUpdateRef.child(String.valueOf(randomPollInRangeOfCurrentDayNumberOfPolls)).child(POLL_ANSWERS_LABEL).child(String.valueOf(randomAnswerBasedFromRandomPollAnswerChoices)).child("Vote_Count").runTransaction(new Transaction.Handler() { 
           @Override 
           public Transaction.Result doTransaction(MutableData mutableData) { 
            mutableData.setValue((Long) mutableData.getValue() + 1); 
            return Transaction.success(mutableData); 
           } 

           @Override 
           public void onComplete(FirebaseError firebaseError, boolean b, DataSnapshot dataSnapshot) { 

           } 
          }); 

         } 

         @Override 
         public void onCancelled(FirebaseError firebaseError) { 

         } 
        }); 
        h.postDelayed(this, delay); 
       } 
      }, delay); 

     } 
    }); 
+0

我認爲你需要停止處理程序,http://stackoverflow.com/questions/18671067/how-to-stop-handler-runnable – stjepano

+0

@stjepano - 不,這個Runnable是一個匿名類 –

+0

一種方法來阻止runnable是在「run()」的最開始處放置一個「活動」布爾值並切換該值以殺死runnable。 –

回答

5

調用h.removeCallbacksAndMessages(null)將清除所有的回調和消息的說明在documentation

刪除回調任何未決柱和發送其obj是 令牌消息。如果令牌爲空,則所有回調和消息都將被刪除。

請注意,如果它已處於執行過程中,則不會停止可運行,但如果它仍處於掛起狀態,則會將其刪除。

+0

不確定你的意思是它在執行中。你的意思是它會在結束之前完成最後的任務嗎?您的解決方案有效,我非常感謝幫助,只是試圖瞭解更多的過程。 – tccpg288

+0

我並不是100%確定我的意思是「停止可運行」。你在延遲發佈runnable,所以如果你的意思是停止runnable,就像停止它在延遲過期之前執行一樣,那麼'h.removeCallbacksAndMessages(null)'就是你想要的。如果你的意思是停止一個可運行的,因爲延遲已經過期,並且我正在執行runnable的run()方法,那麼調用'h.removeCallbacksAndMessages(null)'不會在運行方法的中間停止執行。 –

+0

不知道這最後的評論是否幫助或混淆了你。基本上'h.removeCallbacksAndMessages(null)'將會取消Runnable的執行,只要它仍然未決(尚未開始運行)。如果它已經開始運行,那麼'Runnable'仍然會運行完成。 –

相關問題