2016-11-18 1 views
2

J'ai déclaré une classe pour faire le travail en arrière-plan:variable locale d'activité toujours valable après OnDestroy()

public class ReportLoadTask extends AsyncTask<Void,Void, ReportLoadTaskResult> { 

    public ReportLoadTask(Context context, String barcode, ReportLoadTaskListener l) { 
     ... 
    } 

} 

J'utilise une instance de cette classe comme une variable locale de Activity:

private ReportLoadTask mReportLoadTask; 

... 

en un point de la classe code Je prépare une tâche, puis laisser l'utilisateur décider de poursuivre ou non en montrant AlertDialog:

mReportLoadTask = new ReportLoadTask(this, barcode, this) 

... 

new AlertDialog.Builder(this) 
       .setMessage("Continue with search?") 
       .setPositiveButton("Yes", new DialogInterface.OnClickListener() { 
        public void onClick(DialogInterface dialog, int which) { 
         mReportLoadTask.execute(); 
        } 
       }) 
       .setNegativeButton("No", new DialogInterface.OnClickListener() { 
        public void onClick(DialogInterface dialog, int which) { 
         mReportLoadTask = null; 
         return; 
        } 
       }) 
       .setIcon(android.R.drawable.ic_dialog_alert) 
       .show(); 

Lors du test, je m'attendais à ce que mReportLoadTask devienne null si je détruis Activity (par exemple en faisant tourner l'appareil) alors que AlertDialog est affiché. Mais en pratique, cela n'arrive pas. Toutes les méthodes de cycle de vie Activity (OnPause, OnStop, OnDestroy) sont appelées correctement, même d'autres variables locales (certaines int s) sont détruites mais cette variable semble en quelque sorte "survivre". Pourquoi donc?

Après avoir exploré le Net, il semble que Android est maintenant quelque part une référence de cet objet, mais où pourrait-il garder? La seule référence à cet objet est dans mon Activity et il est en train d'être détruit.

+0

Probablement 'mReportLoadTask' est en cours d'exécution, vous avez essayé après avoir appelé' mReportLoadTask.cancel' avant de faire l'objet null 'mReportLoadTask'? –

+0

'mReportLoadTask' ne deviendra' null' si vous définissez explicitement 'null' à ce – nandsito

Répondre

2

Si vous faites pivoter l'appareil pendant l'affichage d'une boîte de dialogue, cela signifie que votre tâche n'est pas exécutée (vous n'avez pas encore appelé execute). Lorsque vous faites pivoter l'appareil, votre activité est détruite et recréée (il sera lancé à partir de zéro et callbacks du cycle de vie seront appelés à nouveau).

Lorsque l'activité est recréée, mReportLoadTask = new ReportLoadTask(this, barcode, this) est appelée à nouveau et vous obtenez un new instance.

+1

Oui, ce fut le cas. Aurait dû examiner le flux de travail un peu plus. –