2011-09-28 58 views
35

這是我的代碼:Android,AsyncTask,檢查狀態?

在的onCreate:

new LoadMusicInBackground().execute(); 

然後對我的主類的最後,我有這樣的代碼

/** Helper class to load all the music in the background. */ 
class LoadMusicInBackground extends AsyncTask<Void, String, Void> { 
    @Override 
    protected Void doInBackground(Void... unused) { 

     soundPool = new SoundPool(5, AudioManager.STREAM_MUSIC, 100); 
     soundPoolMap = new HashMap<Integer, Integer>(); 

     soundPoolMap.put(A1, 
       soundPool.load(GameScreen_bugfix.this, R.raw.a, 1)); 
     soundPoolMap.put(A3, 
       soundPool.load(GameScreen_bugfix.this, R.raw.b, 1)); 
     soundPoolMap.put(A5, 
       soundPool.load(GameScreen_bugfix.this, R.raw.c_s, 1)); 
     soundPoolMap.put(A6, 
       soundPool.load(GameScreen_bugfix.this, R.raw.d, 1)); 
     soundPoolMap.put(A8, 
       soundPool.load(GameScreen_bugfix.this, R.raw.e, 1)); 
     soundPoolMap.put(A10, 
       soundPool.load(GameScreen_bugfix.this, R.raw.f_s, 1)); 
     soundPoolMap.put(A12, 
       soundPool.load(GameScreen_bugfix.this, R.raw.g_s, 1)); 
     soundPoolMap.put(wrong, 
       soundPool.load(GameScreen_bugfix.this, R.raw.wrong2, 1)); 

     publishProgress(""); 
     Log.v("SOUNDPOOL", "" + soundPoolMap); 
     return (null); 
    } 

    @Override 
    protected void onProgressUpdate(String... item) { 
     // text1.setText(item[0]); 
    } 

    @Override 
    protected void onPostExecute(Void unused) { 
     //Toast.makeText(GameScreen_bugfix.this, "music loaded!", Toast.LENGTH_SHORT).show(); 
    } 
} 

如果音樂沒有加載我得到一個nullpointer異常,看文檔我看到有一個getStatus(),但我試過這樣的事情:

music_load_status=LoadMusicInBackground.getStatus() 

和不工作:( 如何檢查,如果後臺任務就完成了,音樂已經裝?

謝謝!
Ryan

回答

156

getStatus()檢查AsyncTask是否正在掛起,正在運行或已完成。

LoadMusicInBackground lmib = new LoadMusicInBackground(); 

if(lmib.getStatus() == AsyncTask.Status.PENDING){ 
    // My AsyncTask has not started yet 
} 

if(lmib.getStatus() == AsyncTask.Status.RUNNING){ 
    // My AsyncTask is currently doing work in doInBackground() 
} 

if(lmib.getStatus() == AsyncTask.Status.FINISHED){ 
    // My AsyncTask is done and onPostExecute was called 
} 

如果你想檢查你的行動實際上已成功(即音樂已成功加載),那麼你需要拿出你自己的方法確定。 getStatus()只能確定AsyncTask中實際線程的狀態。

+0

謝謝!將檢查出來! – Ryan

+11

澄清:FINISHED是onPostExecute被調用後的狀態。如果您檢查狀態德寧onPostExecute狀態將運行 – user123321

+0

那麼爲什麼它返回postexcute RUNNING,其令人驚訝的 – Sameer

17

這是異步編程 - 你不應該從UI線程檢查,因爲這意味着你是阻塞UI線程(大概在運行循環檢查與Thread.sleep()方法?)。

相反時的AsyncTask完成後,你應該叫:從它的onPostExecute()調用任何你需要的方法活動。

警告:該方法的缺點是,活動必須是活動的後臺線程完成時。這通常不是這種情況,例如,如果背面被提示或方向改變。更好的方法是從onPostExecute()發送廣播,然後有興趣的活動可以註冊接收它。最好的部分是該活動只在當時處於活動狀態時才接收廣播,這意味着多個活動可以註冊,但只有活動的人才能收到廣播。

2

與聽衆

創建的AsyncTask
class ClearSpTask extends AsyncTask<Void, Void, Void> { 

    public interface AsynResponse { 
     void processFinish(Boolean output); 
    } 

    AsynResponse asynResponse = null; 

    public ClearSpTask(AsynResponse asynResponse) { 
     this.asynResponse = asynResponse; 
    } 

    @Override 
    protected void onPreExecute() { 
     super.onPreExecute(); 
     showProgressDialog(); 
    } 

    @Override 
    protected Void doInBackground(Void... voids) { 
     cleardata(); 
     return null; 
    } 

    @Override 
    protected void onPostExecute(Void aVoid) { 
     super.onPostExecute(aVoid); 
     hideProgressDialog(); 
     asynResponse.processFinish(true); 
    } 
} 

和使用的AsyncTask

new ClearSpTask(new ClearSpTask.AsynResponse() { 
     @Override 
     public void processFinish(Boolean output) { 
      // you can go here 
     } 
}).execute(); 

我希望這可以幫助一些人