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()
и это не работает:(
Как проверить, завершена ли фоновая задача и загружена ли музыка?
Спасибо!
Райан
Ответы
Ответ 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();
Я надеюсь, что это может помочь некоторым людям