gpt4 book ai didi

android - 在 Activity 启动时运行的 AsyncTask 在之前被取消后失败

转载 作者:行者123 更新时间:2023-11-29 00:49:56 25 4
gpt4 key购买 nike

当我的应用程序启动时,我正在使用 AsyncTask 来获取联系人的铃声,它工作正常,直到我的 Activity 在 AsyncTask 期间关闭几次之后,发生这种情况后,AsyncTask 将只会到达 onPreExecute()并且从不做后台操作,所以我永远无法获取铃声,直到强制停止或设备重启。

谁能解释为什么会这样?

为什么 AsyncTask 会进入 onPreExecute 但不会运行 doInBackground()?

这是我的代码:(遵循 Shelves 源代码)

public void getRingTone(){
Log.d("cda", "Into getRingTone");
if (audio_service.getStreamVolume(AudioManager.STREAM_RING) > 0) {
if(aRingTone != null){
oRingtone = RingtoneManager.getRingtone(this,
Uri.parse(aRingTone));
}
this.setVolumeControlStream(AudioManager.STREAM_RING);

}
}

private void saveRingToneTask(Bundle outState) {
final SelectRingtoneTask task = srtt;
if (task != null && task.getStatus() != AsyncTask.Status.FINISHED) {
task.cancel(true);

srtt = null;
}
}

private void restoreRingToneTask(Bundle savedInstanceState) {

srtt = (SelectRingtoneTask) new SelectRingtoneTask().execute();

}

private void onAddRingTone() {
srtt = (SelectRingtoneTask) new SelectRingtoneTask().execute();

}

private void onCancelAddRingTone() {
if (srtt != null && srtt.getStatus() == AsyncTask.Status.RUNNING) {
srtt.cancel(true);
srtt = null;
}
}

--

@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
restoreRingToneTask(savedInstanceState);
}

@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
if (isFinishing()) {
saveRingToneTask(outState);
}
}

private class SelectRingtoneTask extends AsyncTask<String, Void, Void> {


@Override
public void onPreExecute() {
Log.d("cda", "Into selectRingToneTask - onPreExecute() - " + selectRingtoneFinished);
findViewById(R.id.answercallimage).setOnClickListener(new OnClickListener() {
public void onClick(View v) {
try {
serviceBinder.answer(lineId);
onCancelAddRingTone();
} catch (RemoteException e) {

e.printStackTrace();
}
}
});


findViewById(R.id.declinecallimage).setOnClickListener(new OnClickListener() {
public void onClick(View v) {

mNotificationManager.cancel(2);
callConnected = false;

try {
serviceBinder.reject(lineId);
onCancelAddRingTone();
} catch (RemoteException e) {

e.printStackTrace();
}
}
});

}



public Void doInBackground(String... params) {
Log.d("cda", "Into selectRingToneTask - !!!!!!!!!!!!!!!");
if(!this.isCancelled()){
getRingTone();
}
return null;

}

@Override
public void onCancelled() {
Log.d("cda", "Into selectRingToneTask - onCancelled() - ");
}

@Override
public void onPostExecute(final Void unused) {
selectRingtoneFinished = true;
Log.d("cda", "Into selectRingToneTask - onPostExecute - " + selectRingtoneFinished);
if(oRingtone != null && playRingTone){
Log.d("cda", "Into getRingTone - PLAY RINGTONE");
oRingtone.play();
}
}
}

onAddRingtone() 用于 onCreate 和 onCancelRingTone() 用于 onDestroy() 以及您可以在上面的代码中看到的地方。

我已经在这个问题上花了 3 天了,我还没有找到解决方案?我采取了错误的方法吗?使用取消错误?有错误吗?

最佳答案

我相信正在发生的事情是您的 AsyncTask 拥有旧 Activity 的句柄,当您在任务中间创建一个新 Activity 时,您实际上已经泄露了您的 AsyncTask。 DroidFu 库对此有一个解决方法,即跟踪重写的 Application 类中的 Activity Activity 和依赖于该 Application 的重写的 AsyncTask。幸运的是它是开源的,所以你可以看到他们是如何做到的。 Additional Info

关于android - 在 Activity 启动时运行的 AsyncTask 在之前被取消后失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3686399/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com