2015-03-11 1 views
2

J'ai un tas d'activités A-> B-> C-> D et ils fonctionnent tous bien. Je les ai testés avec et sans internet, plusieurs configurations et j'ai déclenché l'écran pour faire pivoter chacun d'eux pour voir s'ils allaient tomber en panne. Mais sur mon téléphone Android (pas émulateur), après un certain temps que l'application est en arrière-plan, si je l'ouvre (soit par mes récents ou par mon menu principal), je reçois une série de accidents inexplicables. C'est littéralement l'activité D se bloque, va à C. C se bloque, va à B. B se bloque, va à A. A se bloque, se réinitialise, et s'ouvre bien. Ça me rend fou.Android: plantages inexpliqués lorsque l'application est rouverte après un certain temps

Il est toujours NullPointerException sur des objets, comme ceux-ci:

java.lang.RuntimeException: Unable to start activity ComponentInfo{net.getfoodie.foodie/net.getfoodie.foodie.ui.exploremenu.MenuFragmentActivity}: java.lang.NullPointerException 
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2305) 
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2363) 
at android.app.ActivityThread.access$900(ActivityThread.java:161) 
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1265) 
at android.os.Handler.dispatchMessage(Handler.java:102) 
at android.os.Looper.loop(Looper.java:157) 
at android.app.ActivityThread.main(ActivityThread.java:5356) 
at java.lang.reflect.Method.invokeNative(Native Method) 
at java.lang.reflect.Method.invoke(Method.java:515) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1265) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1081) 
at de.robv.android.xposed.XposedBridge.main(XposedBridge.java:132) 
at dalvik.system.NativeStart.main(Native Method) 
Caused by: java.lang.NullPointerException 
at net.getfoodie.foodie.ui.exploremenu.MenuGridAdapter.<init>(MenuGridAdapter.java:71) 
at net.getfoodie.foodie.ui.exploremenu.MenuFragment.onActivityCreated(MenuFragment.java:75) 
at android.support.v4.app.Fragment.performActivityCreated(Fragment.java:1794) 
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:967) 
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1126) 
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1108) 
at android.support.v4.app.FragmentManagerImpl.dispatchActivityCreated(FragmentManager.java:1917) 
at android.support.v4.app.FragmentActivity.onStart(FragmentActivity.java:544) 
at net.getfoodie.foodie.ui.exploremenu.MenuFragmentActivity.onStart(MenuFragmentActivity.java:89) 
at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1189) 
at android.app.Activity.performStart(Activity.java:5436) 
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2278) 
... 12 more 

Et par exemple, l'erreur est au-dessus en raison d'un objet nul du sdk d'analyse syntaxique. Mais l'objet a déjà été récupéré pendant l'OnCreate de l'activité, et je suppose qu'il se perd lorsque l'activité est recréée? bien que je m'assure que je le prends dans mon OnCreate(), et j'ai testé la rotation?

Selon vous, à quoi cela est-il dû? Est-ce qu'il me manque quelque chose dans le cycle de vie de mon application? Et plus important encore, comment puis-je déclencher l'activité kill/sleep sur mon émulateur Android afin que je puisse reproduire le problème et essayer de le réparer?

+1

Pouvez-vous publier le code à partir de 'net.getfoodie.foodie.ui.exploremenu.MenuGridAdapter'? Il y a une exception nullpointer quelque part. 'MenuFragment.onActivityCreated' serait également utile. –

+0

@JamesMcCracken Je pourrais mais ils sont assez gros (500 lignes de code ici). La chose est, chaque fois que j'en fixe un, un nouveau apparaît plus tard. Mais je ne peux pas déclencher ces erreurs sur mon émulateur, c'est le vrai problème ... – Stephane

+0

Si vous obtenez cette erreur après avoir revenir à votre application après une longue période, votre application a probablement été complètement détruite. Ceci est différent de simplement tourner un écran et avoir une activité recréée. Il recrée l'ensemble de votre application afin que les données utilisées par l'activité, stockées dans un seul ou de manière statique, ne soient pas présentes tant que vous ne les avez pas remplies. –

Répondre

1

Les activités qui ne sont pas affichées à l'écran sont fréquemment supprimées par Android pour la mémoire. Lorsque vous revenez à une activité via des recents, l'activité la plus récente sera lancée mais si elle a été supprimée, elle n'aura aucun contexte. Elle aura l'intention avec laquelle elle a été lancée mais n'a aucune variable statique ou singletons assignée aux valeurs précédentes. Cela provoque des problèmes pour beaucoup d'applications. La solution consiste soit à permettre à toute activité de remplir ces valeurs d'une façon ou d'une autre, soit à détecter ce cas et à lancer une activité appropriée avec CLEAR_TOP défini pour tuer l'ancien état.

Oh, et pour reproduire tout ce dont vous avez besoin, forcez l'arrêt des réglages du gestionnaire d'activité. Allez à l'activité D, puis forcez l'arrêt. Puis retour via recents. Par exemple, j'ai une application avec un LoginActivity, et une MainActivity. MainActivity suppose que LoginActivity a configuré un singleton utilisateur. Mon code dans MainActivity est:

public void onCreate(Bundle bundle){ 
    super.onCreate(bundle); 
    if(User.getCurrentUser() == null){ 
    Intent intent = new Intent(this, LoginActivity.class); 
    intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
    startActivity(intent); 
    finish(); 
    return; 
    } 
    //Continue on with onCreate for this activity 
} 

Ceci relancera l'activité de connexion si l'objet Utilisateur n'a pas été configuré.

+0

qui a du sens. Avez-vous un code qui illustre une bonne façon de mettre en œuvre ce que vous décrivez? – Stephane

+0

Son très personnalisé à l'application. Je mets un exemple d'une façon de le gérer dans ma réponse, il va relancer l'application de l'activité originale. Ce n'est peut-être pas la meilleure façon de le faire, cela dépend de la facilité avec laquelle vous l'avez recréé. –