2015-05-06 2 views
4

У меня есть эта AsyncTask, которая спит 0,1 секунды каждый раз, когда выполняется «doInBackground», до этого я использовал CountDownTimer для управления своим временем.Пауза таймера без разрушения и воссоздания - Android

Моя проблема: я хочу достичь таймера, который может приостановить, не вызывая .cancel() и при запуске создания другого таймера.

Есть ли способ достичь этого - андроид? Я не нашел, как это сделать по-другому. Можете ли вы, например, это сделать?

Где я нашел примеры отменяя таймер:

EDIT

Ответ на вопрос Kevin Krumwiede: Этот проект - это своего рода игра, в которой я должен ударить по блокам в определенное время, поэтому я хочу добиться способа остановить таймер, когда игрок использует какую-то особую силу (ударил указанная кнопка).

EDIT2

Ответ Kushal: Я не знаю, если вы собрали этот код, но я не могу использовать TASK1 переменную. Здесь идет код:

public void doIt(){ 
     final ScheduledExecutorService exec = Executors.newSingleThreadScheduledExecutor(); 

     final Runnable task = 
     new Runnable() { 

      @Override 
      public void run() { 
       timerAsyncTask.execute(); 

       if(true) { 
        exec.shutdown(); // shutdown this execution 
        //exec = Executors.newSingleThreadScheduledExecutor(); 
        exec.scheduleAtFixedRate(task, 0, 100, TimeUnit.MILLISECONDS); 
       } 
      } 
     }; 
     exec.scheduleAtFixedRate(task, 0, 100, TimeUnit.MILLISECONDS); 
    } 

Здесь exec = Executors.newSingleThreadScheduledExecutor(); он показывает мне ошибку:

Error:(33, 21) error: cannot assign a value to final variable exec

То, что я думаю, что это довольно хорошо, когда ехес является окончательной переменной.

А вот exec.scheduleAtFixedRate(task, 0, 100, TimeUnit.MILLISECONDS); я получил другую ошибку:

Error:(34, 46) error: variable task might not have been initialized

Можете ли вы объяснить, как я могу использовать этот кусок кода? Я совершенно новый для Android. Спасибо.

+1

Практически никогда не было оснований использовать «Таймер» в Android. Расскажите подробнее о вашем случае использования и, возможно, мы можем предложить более подходящее решение. –

+0

Я редактировал вопрос. – guisantogui

ответ

2

Я предлагаю вам избежать Таймеры в Android в целом. Android имеет легкий вес и лучшее решение под названием Handler

Вы можете найти сравнение между этими двумя here. Подводя итог

Сравнение Handler VS Таймер

  • Хотя перепланирования Handler очень легко, вы не можете перепланировать Таймер
  • В обработчике вы можете прикрепить к любой Runnable, но таймер расписания только для один TimerTask
  • TimerTask - это чисто фоновая задача, поэтому вы не можете обновить UserInterface, но это неверно для Runnables обработчика
  • Таймер Причины Исключения
  • Таймер имеет тенденцию течь больше памяти по сравнению с Handler см. График объект сохраняет по таймеру и обработчику. Он быстро увеличится для Таймер, если вы создаете и планируете новую задачу.

Как говорится, использование Handler довольно просто. Вот пример кода

import android.os.Bundle; 
import android.os.Handler; 
import android.os.Looper; 
import android.support.v7.app.AppCompatActivity; 

public class TestActivity extends AppCompatActivity { 


    private static int INITIAL_TIMER_DELAY = 100; 
    private static int TIMER_PERIOD = 100; 

    private android.os.Handler handler; 
    private Runnable runnable; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     handler = new Handler(Looper.getMainLooper()); 
     runnable = new Runnable() { 
      @Override 
      public void run() { 
       // Do something and reschedule ourself 
       handler.postDelayed(this, TIMER_PERIOD); 
      } 
     }; 
     handler.postDelayed(runnable, INITIAL_TIMER_DELAY); 

    } 

    @Override 
    protected void onDestroy() { 
     super.onDestroy(); 
     cancelTimer(); 
    } 

    private void cancelTimer() { 
     if (handler != null) { 
      handler.removeCallbacks(runnable); 
     } 
    } 

    private void rescheduleRunnable() { 
     handler.postDelayed(runnable, INITIAL_TIMER_DELAY) 
    } 


} 
+0

Это работает, спасибо! – guisantogui

+0

Спасибо тоже :) –

2

Вы можете достичь своей requriment с помощью ScheduledExecutorService класса

Основная разница между ScheduledExecutorService и Таймер класс:

  • Использование класса Timer, вы не можете проверить, как происходит ваше исполнение. Вы можете запустить и остановить выполнение, но не можете проверить выполнение в соответствии с условием
  • ScheduledExecutorService предоставляет возможность проверить, как выполняется выполнение между запуском и остановкой вызова.Если какое-либо выполнение этой задачи наталкивается исключение, последующие казни подавляются

Как мы можем достичь ваших требований:

  • Нам нужно 0,1 секунды задержки между doInBackground() исполнением
  • Мы должны быть в состоянии приостановить наше исполнение, когда другое исполнение начинается

    ScheduledExecutorService exec = Executors.newSingleThreadScheduledExecutor(); 
    
    Runnable task1 = new Runnable() { 
        public void run() { 
        // start your AsyncTask here 
        new <your_task>().execute(); 
    
        if (<check_your_condition_when_to_pause>) { 
         exec.shutdown(); // shutdown this execution 
         exec = Executors.newSingleThreadScheduledExecutor(); 
         exec.scheduleAtFixedRate(task1, 0, 100, TimeUnit.MILLISECONDS); 
         // here i have passed task1 for example 
         // here we need to pass next task runnable which 
         // we want to run after 0.1 seconds 
        } else { 
         // continue normal 
        } 
    
        } 
    }; 
    
    exec.scheduleAtFixedRate(task1, 0, 100, TimeUnit.MILLISECONDS); 
    

Кредитная ссылка: Answer 1 и Answer 2

Я надеюсь, что это поможет решить некоторые ваши сомнения

+0

Первая ошибка удаляется, когда вы удаляете 'final' из declarayion .. Для второй ошибки объявите' Runnable task = null; ', а затем вызовите' new' operator 'task = new Runnable() {' – Kushal

Смежные вопросы