Приостановить и возобновить AsyncTasks? (Android) - PullRequest
5 голосов
/ 19 марта 2010

У меня есть AsyncTask, который действует как таймер обратного отсчета для моей игры. По завершении обратного отсчета отображается экран окончания времени, а также обновляется таймер, отображаемый на экране. Все работает нормально, за исключением того, что мне нужно иметь возможность сделать паузу и возобновить ее, когда в игре нажата кнопка паузы.

Если я отменю его и попытаюсь повторно выполнить, он завершится с IllegalStateException. Если я отменяю его и создаю новый AsyncTask вместо него, старый начинает работать снова, а новый запускается одновременно.

Есть ли способ отменить / приостановить таймер и перезапустить его, используя AsyncTask s, или есть другой способ сделать это?

EDIT:

Вот что я сделал для решения:

mhandler = new Handler();

        mtimerTask = new Runnable(){
                public void run(){
                    mtimer -= 1;
                    if(mtimer == 0)
                    {
                        mhandler.removeCallbacks(this);
                    }
                    mhandler.postDelayed(this, 1000);
                }
        };
        mhandler.removeCallbacks(mtimerTask);
        mhandler.post(_timerTask)`

Не уверен, что это лучший способ, но у меня это сработало.

Ответы [ 3 ]

13 голосов
/ 19 марта 2010

У меня есть AsyncTask, который действует как таймер обратного отсчета для моей игры.

Это не очень хорошее применение AsyncTask. AsyncTasks должен делать работу и быть готовым, а не пытаться торчать. Для таймера обратного отсчета используйте postDelayed() - вам даже не нужен фоновый поток. Или используйте CountDownTimer.

Если я отменю это и попытаюсь повторно выполнить это сбой с IllegalStateException.

Документация гласит: «Задача может быть выполнена только один раз (исключение будет выдано при попытке второго выполнения.)»

5 голосов
/ 08 сентября 2013

Привет
Вот еще одно грязное решение для приостановки AsyncTask, которое работает для меня.
Но это не совсем чистый код. Сделайте это в своем классе, который расширяет AsyncTask.

public void pause()
    {
        this.isPaused = true;
    }

    public void resume()
    {
        this.isPaused = false;
    }

    @Override
    protected Void doInBackground(Void... params)
    {
        while(!isCancelled())
        {
            while(isPaused)
                sleep(5000);

//...

private void sleep(long sleepDuration)
    {
        try
        {
            Thread.sleep(sleepDuration);
        }
        catch(InterruptedException e)
        {
            e.printStackTrace();
        }
    }
1 голос
/ 07 июля 2010

до JaySS,

  1. Я не думаю, что AsyncTask можно возобновить. Что касается паузы, я попытался использовать AsyncTask.cancel (true), чтобы остановить задачу, которая выполняется. После отмены я использую AsyncTask.isCancelled (), чтобы проверить, отменено ли это или нет. Вернулось правда; однако AsyncTask все еще работает.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...