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

如果音乐没有加载,我得到一个空指针exception,看看我看到的文档有一个getStatus(),但我已经试过这样的事情:

 music_load_status=LoadMusicInBackground.getStatus() 

这不工作:(如何检查后台任务是否完成,音乐已经加载?

谢谢!
瑞安

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

这是asynchronous编程 – 你不应该从UI线程检查,因为这意味着你正在阻塞UI线程(大概运行检查循环与Thread.sleep()?)。

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

警告:这种方法的缺点是当后台线程结束时Activity必须处于活动状态。 这通常不是这种情况,例如,如果背面被提示或者方向被改变。 更好的方法是从onPostExecute()发送一个广播,然后有兴趣的活动可以注册接收它。 最好的部分是该活动只在该时间处于活动状态时才接收广播,这意味着多个活动可以注册,但只有活动的人才能收到。

用监听器创buildasynctask

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

我希望这可以帮助一些人