2016-02-19 3 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

Я думаю, вам нужно остановить Handler, 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% уверен, что я имею в виду под "stop runnable". Вы отправляете runnable с задержкой, поэтому, если вы имеете в виду остановить runnable, как остановить его от выполнения до истечения задержки, тогда 'h.removeCallbacksAndMessages (null)' - это то, что вы хотите. Если, однако, вы имеете в виду остановить runnable, поскольку в задержке уже истек, и в настоящее время я выполняю метод run() 'runnable, а затем вызывать' h.removeCallbacksAndMessages (null) 'не остановит выполнение в середине метода запуска , –

+0

Не уверен, что последний комментарий помог или смутил вас больше. В основном 'h.removeCallbacksAndMessages (null)' отменяет выполнение Runnable, пока он все еще ожидает (еще не запущен). Если он запустится, то «Runnable» все равно будет завершен. –