Подтвердить что ты не робот

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

и это не работает:( Как проверить, завершена ли фоновая задача и загружена ли музыка?

Спасибо!
Райан

4b9b3361

Ответ 1

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.

Ответ 2

Это асинхронное программирование - вы не должны проверять из потока пользовательского интерфейса, потому что это означает, что вы блокируете поток пользовательского интерфейса (предположительно выполняете цикл проверки с помощью Thread.sleep()?).

Вместо этого вы должны вызываться при выполнении AsyncTask: из него onPostExecute() вызывать любой метод в действии, в котором вы нуждаетесь.

Предостережение. Недостатком этого подхода является то, что активность должна быть активной, когда заканчивается фоновый поток. Это часто бывает не так, например, если задняя панель прервана или изменилась ориентация. Лучший подход - отправить трансляцию с onPostExecute(), а затем заинтересованные действия могут зарегистрироваться для ее получения. Лучше всего то, что Activity получает только трансляцию, если она активна в это время, а это означает, что несколько видов деятельности могут регистрироваться, но только активный получит ее.

Ответ 3

Создайте 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();

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