簡體   English   中英

暫停並恢復AsyncTasks? (Android)

[英]Pause and Resume AsyncTasks? (Android)

我有一個AsyncTask ,它充當游戲的倒數計時器。 完成倒數計時后,它會顯示超時屏幕,並更新屏幕上顯示的計時器。 一切正常,除了在按下游戲中的暫停按鈕時我需要能夠暫停並繼續執行此操作。

如果我取消它並嘗試重新執行它,它將崩潰,並IllegalStateException 如果我取消它並在其位置實例化一個新的AsyncTask,則舊的將再次運行,而新的AsyncTask將同時運行。

是否可以使用AsyncTask取消/暫停計時器並重新啟動計時器,或者我應該采用其他方式執行此操作?

編輯:

這是我為解決方案所做的:

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)`

不知道這是否是最好的解決方法,但這對我有用。

我有一個AsyncTask,它充當游戲的倒數計時器。

那不是AsyncTask的好用法。 AsyncTasks應該可以完成工作,而不是閑逛。 對於倒數計時器,請使用postDelayed() -您甚至不需要后台線程。 或者,使用CountDownTimer

如果我取消它並嘗試重新執行它,它會崩潰並拋出IllegalStateException。

文檔指出:“該任務只能執行一次(如果嘗試第二次執行,則將引發異常。)”

你好
這是暫停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();
        }
    }

對於JaySS,

  1. 我認為AsyncTask無法恢復。 至於暫停,我嘗試使用AsyncTask.cancel(true)來停止正在運行的任務。 取消后,我使用AsyncTask.isCancelled()來檢查它是否被取消。 它返回true; 但是,AsyncTask仍在運行。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM