2 Stimmen

AsyncTask, der beim Start einer Aktivität ausgeführt werden soll, schlägt fehl, nachdem er zuvor abgebrochen wurde

Ich verwende eine AsyncTask, um den Klingelton für einen Kontakt zu holen, wenn meine Anwendung startet, es funktioniert gut, bis nach meiner Aktivität schließt ein paar Mal während der AsyncTask, nachdem dies geschieht die AsyncTask nur immer zu onPreExecute() und nie doInBackground, so dass ich nie den Klingelton dann bis entweder eine Kraft zu stoppen oder Gerät neu starten abrufen kann.

Kann jemand erklären, warum dies der Fall sein könnte?

Warum erreicht die AsyncTask zwar onPreExecute, führt dann aber nie doInBackground() aus?

Hier ist mein Code: (In Anlehnung an den Shelves-Quellcode)

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

Und onAddRingtone() wird in onCreate und onCancelRingTone() in onDestroy() verwendet, so wie Sie es im obigen Code sehen können.

Ich habe 3 Tage damit verbracht und konnte keine Lösung finden? Habe ich den falschen Ansatz gewählt? Verwende ich cancel falsch? Gibt es einen Fehler?

2voto

Nathan Schwermann Punkte 30844

Ich glaube, was geschieht, ist, dass Ihre AsyncTask einen Griff auf die alte Aktivität hat, wenn Sie eine neue in der Mitte der Aufgabe erstellen Sie im Wesentlichen Ihre AsyncTask geleckt haben. Die DroidFu-Bibliothek hat einen Workaround für dieses Problem, indem sie die aktive Aktivität in einer überschriebenen Anwendungsklasse und einer überschriebenen, von der Anwendung abhängigen AsyncTask verfolgt. Glücklicherweise ist es Open Source, so dass Sie sehen können, wie sie es tun. Zusätzliche Informationen

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X