Android,AsyncTask,检查状态?

时间:2011-09-28 19:34:18

标签: android

这是我的代码:

on 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()

那是行不通的:( 如何检查后台任务是否完成以及音乐是否已加载?

谢谢!
莱恩

3 个答案:

答案 0 :(得分:162)

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中实际线程的状态。

答案 1 :(得分:17)

这是异步编程 - 您不应该从UI线程检查,因为这意味着您正在阻止UI线程(可能是使用Thread.sleep()运行检入循环?)。

相反,当AsyncTask完成时你应该被调用:从onPostExecute()调用你需要的Activity中的任何方法。

警告:这种方法的缺点是当后台线程完成时,Activity必须处于活动状态。通常情况并非如此,例如,如果背面被修剪或方向改变。更好的方法是从onPostExecute()发送广播,然后感兴趣的活动可以注册接收它。最好的部分是,活动仅在当时处于活动状态时才接收广播,这意味着多个活动可以注册,但只有活动的活动才会收到。

答案 2 :(得分:4)

使用侦听器创建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();

我希望这可以帮助一些人