web-dev-qa-db-fra.com

OnDestroy n'a jamais appelé?

J'utilise le code suivant dans ma ListActivity

// a separate class in project
public class MyActivity extends ListActivity {
    // some common functions here..
}

public class SelectLocation extends MyListActivity {

    public void onCreate(Bundle savedInstance) {
        // here.....
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        if (adap != null) adap = null;
        if (list != null) list = null;
        System.gc();
    }
}

quelqu'un me guide pourquoi la méthode onDestroy n'est pas appelée dans mon code?

26
UMAR

onDestroy() est appelé uniquement lorsque le système manque de ressources (mémoire, temps processeur, etc.) et prend la décision de supprimer votre activité/application ou lorsque quelqu'un appelle finish() sur votre activité.

Donc, pour tester votre code (), vous pouvez créer un bouton de test, qui appellera finish() sur votre activité.

En savoir plus ici .

De plus, je pense que vous n'avez pas besoin d'appeler toutes ces choses dans onDestroy() jusqu'à ce que adap ne soit pas une ressource critique. Et même dans ce cas Android dispose de mécanismes pour les éliminer correctement.

56
Vladimir Ivanov

Il n'y a aucune garantie que votre méthode onDestroy sera appelée du tout.

Le code que vous utilisez dans votre méthode onDestroy n'est pas du tout nécessaire. Si destroy est appelé, votre activité sera supprimée de la pile et sera de toute façon libre pour la collecte des ordures avec toutes les ressources qui y sont référencées uniquement par l'activité. System.gc () est également censé être un mauvais style. Sur Android le système sait presque toujours quand c'est le meilleur moment pour faire un ramasse-miettes. La plupart du temps, une activité termine le ramasse-miettes est déclenchée automatiquement. Supprimez simplement toute la méthode onDestroy. Si vous avoir des problèmes avec la mémoire globale de votre application, le problème est ailleurs.

28
Janusz

Dans la plupart des téléphones, lorsque le bouton de retour est enfoncé, les méthodes onStop () et onDestroy () sont appelées deux fois, mais si ce n'est pas votre cas, vous pouvez créer un bouton pour appeler le finish (); méthode.

5
Jordi Tamargo