在我的应用程序中,我在启动Activity时使用AsyncTask来获取特定联系人的铃声。
它正常工作,但我注意到如果应用程序在AsyncTask到达doInBackground方法之前停止了两次,那么当Activity再次启动时,AsyncTask无法正常运行,只能进入onPreExecute()方法。
这是我的代码:
AsyncTask本身:
private class SelectRingtoneTask extends AsyncTask<String, Void, Void> {
// can use UI thread here
protected void onPreExecute() {
Log.d("cda", "Into selectRingToneTask - onPreExecute() - " + selectRingtoneFinished);
}
// automatically done on worker thread (separate from UI thread)
protected Void doInBackground(final String... args) {
Log.d("cda", "Into selectRingToneTask - !!!!!!!!!!!!!!!");
getRingTone();
return null;
}
// can use UI thread here
protected void onPostExecute(final Void unused) {
selectRingtoneFinished = true;
Log.d("cda", "Into selectRingToneTask - onPostExecute - " + selectRingtoneFinished);
}
}
我在启动时调用AsyncTask:
if(srtt == null){
srtt = new SelectRingtoneTask();
Log.d("cda", "RingTone - " + srtt.getStatus());
}
srtt.execute();
当我启动活动并在AsyncTask完成之前关闭Activity时会出现问题,如果发生这种情况,它似乎没问题,但是在第二次发生之后,AsyncTask只会进入onPreExecute()方法并且在应用程序强制停止并重新启动之前,将永远不会再次完成。
有人知道为什么会这样吗?
答案 0 :(得分:2)
当您的Activity被销毁时,您需要cancel
AsyncTask,并且在尝试使用获取的结果之前,在AsyncTask的方法中检查isCancelled
标志。
我强烈建议您阅读Shelves的源代码,了解如何在配置更改中保留任务以及如何在销毁活动时正确取消任务。
答案 1 :(得分:0)
if(srtt == null){ <--- Not needed
srtt = new SelectRingtoneTask();
Log.d("cda", "RingTone - " + srtt.getStatus());
}
srtt.execute();
我不确定你是什么关闭,但我有线程的类似问题。 在我看来,这里的问题是,当你不被允许时,你第二次触发这个相同的活动任务。在关闭活动时解决问题,取消线程并确保将srtt设置为null。希望这有帮助