AsyncTask для запуска при запуске активности не выполняется после отмены ранее - PullRequest
2 голосов
/ 10 сентября 2010

Я использую AsyncTask для извлечения мелодии звонка для контакта, когда мое приложение запускается, оно работает нормально до тех пор, пока во время AsyncTask несколько раз не закрывается моя активность, после того, как это произойдет, AsyncTask будет когда-либо попадать только в onPreExecute ()и никогда не делаю inInBackground, поэтому я никогда не смогу извлечь рингтон, пока не произойдет принудительная остановка или перезапуск устройства.

Может кто-нибудь объяснить, почему это может происходить?

Почему AsyncTask попадает на onPreExecute, нотогда никогда не запускать doInBackground ()?

Вот мой код: (после исходного кода полок)

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 дня на это, и я не смог найти решение?Я принимаю неправильный подход?Использование отмены неправильно?Есть ли ошибка?

1 Ответ

2 голосов
/ 10 сентября 2010

Я полагаю, что происходит то, что ваш AsyncTask управляет старым действием, когда вы создаете новое в середине задачи, вы по существу утекли AsyncTask.В библиотеке DroidFu есть обходной путь, отслеживая активную активность в переопределенном классе Application и переопределенной AsyncTask, зависящей от Application.К счастью, с открытым исходным кодом, чтобы вы могли видеть, как они это делают. Дополнительная информация

...