finition en activité à partir de la vue personnalisée à l'aide de contexte
Voici mon code:
private void makeDialog2() {
AlertDialog.Builder about = new AlertDialog.Builder(getContext());
about.setTitle("You Won!");
about.setPositiveButton("Play Again",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface arg0, int arg1) {
Intent playIntent2 = new Intent(getContext(),
PracticePlayActivity.class);
playIntent2.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
getContext().startActivity(playIntent2);
((Activity) getContext()).finish();
}
});
about.setNegativeButton("Exit", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface arg1, int arg2) {
Intent playIntent = new Intent(getContext(),
PlayChooserActivity.class);
playIntent.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
getContext().startActivity(playIntent);
((Activity) getContext()).finish();
}
});
about.show();
}
Ce code est invité lorsque l'utilisateur perd le jeu et veut réessayer. Cependant lorsque je clique sur réessayer plus de 4 fois l'application se bloque. Je suis soupçonner une fuite de mémoire. Après quelques tests dans le logcat j'ai réussi à trouver que l'activité est toujours en cours après une nouvelle tentative.
Mon plan est de s'attaquer à ce problème avec deux choses. Recycler mon un drawable et la fin de la première activité dans son ensemble. Cependant, la première activité n'est pas la fermeture, même après que je l'appel terminer. Toute aide? (À l'aide de getContext() dans d'autres parties de mon code a bien fonctionné jusqu'ici).
EDIT: En mettant fin à l'activité n'est il détruire les variables automatiquement? ou dois-je encore besoin d'effacer les images à partir de l'Android de la mémoire? Des idées comment je peux faire cela?
OriginalL'auteur user1012016 | 2011-12-21
Vous devez vous connecter pour publier un commentaire.
Si
makeDialog2()
est déclarée à l'intérieur d'unActivity
essayez d'utiliserthis
ouYourActivityName.this
au lieu degetContext()
. Si c'est non, alors essayer de passer leContext
de la méthode en tant que paramètre à l'aide dethis
ouYourActivityName.this
d'où vous appelez la méthode.Finir un
Activity
devrait le détruire et de toutes les ressources. Si vous démarrez une nouvelle instance de laActivity
plus tard, il va re-créer l'ensemble de ses ressources. Sauf si vous utilisez une sorte de variables statiques - ils vont rester "en vie" aussi longtemps que votre application est en cours d'exécution.Prendre un coup d'oeil à la documentation pour le
Activité
de la classe.Comme vous pouvez le voir
Context
est une super-classe deActivity
- ce qui signifie que chaqueActivity
est unContext
mais pas tous lesContext
est unActivity
. En d'autres termes((Activity) getContext()).finish();
pourrait causer uneClassCastException
.Ce que vous pourriez faire pour vérifier que le
Context
vous obtenez est en fait aussi unActivity
est de faire une vérification comme ceci:Ajouter que juste avant le vous appeler
finish()
et de vérifier si LogCat consent à ce que ses unActivity
.en fait désolé à ce sujet mais il y a un problème. L'endroit où cette méthode est appelé est en fait le surfaceview, par conséquent, n'importe quel paramètre je donne il sera, pour l'essentiel encore être getContext(). Est-il un moyen de contourner cela? Je ne vois pas pourquoi (de(l'Activité) getContext()).finish(); ne fonctionne pas
J'ai ajouté un peu plus de choses à ma réponse.
OriginalL'auteur kaspermoerch
Je l'ai résolu. C'est peut-être un bug, mais j'ai dû appeler en premier le nom de la classe avant la getContext() fonction. Peut-être un bug avec la boîte de dialogue de la fonction ou d'une erreur dans mon code structure.
OriginalL'auteur user870380
J'ai réussi à trouver une solution à ce problème, et éviter que ClassCastException.
Tout d'abord annuler la getcontexteapplication() la méthode de votre Activité, de sorte qu'il retourne l'instance actuelle
Cette méthode retournera toujours l'exemple avec un Cadre de référence type, mais vous pouvez maintenant lancer à YourActivity avant de la passer sur votre affichage personnalisé.
Aussi, assurez-vous que vous faites référence à ce avec
YourActivity
au lieu deContext
dans votre affichage personnalisé.Espère que ce post aidera quelqu'un d'autre qui vient de partout 🙂
OriginalL'auteur quicksilver