2010-09-08 7 views
2

Je semblent avoir un accident après une longue période de temps sur mon appareil:Est-ce que Android tue les variables locales après un certain temps?

E/AndroidRuntime(1115): FATAL EXCEPTION: main 
E/AndroidRuntime(1115): java.lang.RuntimeException: Unable to resume activity {org.stocktwits.activity/org.stocktwits.activity.Main}: java.lang.NullPointerException 
E/AndroidRuntime(1115): at android.app.ActivityThread.performResumeActivity(ActivityThread.java:3128) 
E/AndroidRuntime(1115): at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3143) 
E/AndroidRuntime(1115): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2059) 
E/AndroidRuntime(1115): at android.os.Handler.dispatchMessage(Handler.java:99) 
E/AndroidRuntime(1115): at android.os.Looper.loop(Looper.java:123) 
E/AndroidRuntime(1115): at android.app.ActivityThread.main(ActivityThread.java:4627) 
E/AndroidRuntime(1115): at java.lang.reflect.Method.invokeNative(Native Method) 
E/AndroidRuntime(1115): at java.lang.reflect.Method.invoke(Method.java:521) 
E/AndroidRuntime(1115): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868) 
E/AndroidRuntime(1115): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626) 
E/AndroidRuntime(1115): at dalvik.system.NativeStart.main(Native Method) 
E/AndroidRuntime(1115): Caused by: java.lang.NullPointerException 
E/AndroidRuntime(1115): at org.stocktwits.activity.Main.getQuotesFromYQL(Main.java:457) 
E/AndroidRuntime(1115): at org.stocktwits.activity.Main.onStart(Main.java:339) 
E/AndroidRuntime(1115): at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1129) 
E/AndroidRuntime(1115): at android.app.Activity.performStart(Activity.java:3781) 
E/AndroidRuntime(1115): at android.app.Activity.performRestart(Activity.java:3811) 
E/AndroidRuntime(1115): at android.app.Activity.performResume(Activity.java:3816) 
E/AndroidRuntime(1115): at android.app.ActivityThread.performResumeActivity(ActivityThread.java:3118) 
E/AndroidRuntime(1115): ... 10 more 

onStart() semble fonctionner très bien quand je sors et reprendre mon application, mais échoue après un certain temps ...

ligne 457 dans mon application est la 'requête' JSON objet:

/** 
    * Performs YQL, parses JSON, and adds Quotes to adapter 
    */ 
    private void getQuotesFromYQL() { 
     quotesAdapter.clear(); 

     System.out.println("YQL QUERY: " + buildQuery()); 
     JSONObject json = RestClient.connect(buildQuery()); 
     try { 

      JSONObject query = json.getJSONObject("query"); 
      JSONObject results = query.getJSONObject("results"); 

      if (query.getString("count").equals("1")) { // YQL JSON doesn't 
       // return an array for 
       // single quotes 
       JSONObject quote = results.getJSONObject("quote"); 

       Quote myQuote = new Quote(); 
       myQuote.setName(quote.getString("Name")); 
       myQuote.setSymbol(quote.getString("Symbol")); 
       myQuote.setLastTradePriceOnly(quote 
         .getString("LastTradePriceOnly")); 
       myQuote.setChange(quote.getString("Change")); 
       myQuote.setOpen(quote.getString("Open")); 
       myQuote.setMarketCapitalization(quote 
         .getString("MarketCapitalization")); 
       myQuote.setDaysHigh(quote.getString("DaysHigh")); 
       myQuote.setYearHigh(quote.getString("YearHigh")); 
       myQuote.setDaysLow(quote.getString("DaysLow")); 
       myQuote.setYearLow(quote.getString("YearLow")); 
       myQuote.setVolume(quote.getString("Volume")); 
       myQuote.setAverageDailyVolume(quote 
         .getString("AverageDailyVolume")); 
       myQuote.setPeRatio(quote.getString("PERatio")); 
       myQuote.setDividendYield(quote.getString("DividendYield")); 

       quotesAdapter.add(myQuote); 
      } else { 
       JSONArray quotes = results.getJSONArray("quote"); 
       for (int i = 0; i < quotes.length(); i++) { 

        JSONObject quote = quotes.getJSONObject(i); 
        // .getJSONObject("quote"); 

        // Do something with the user 
        Quote myQuote = new Quote(); 
        myQuote.setName(quote.getString("Name")); 
        myQuote.setSymbol(quote.getString("Symbol")); 
        myQuote.setLastTradePriceOnly(quote 
          .getString("LastTradePriceOnly")); 
        myQuote.setChange(quote.getString("Change")); 
        myQuote.setOpen(quote.getString("Open")); 
        myQuote.setMarketCapitalization(quote 
          .getString("MarketCapitalization")); 
        myQuote.setDaysHigh(quote.getString("DaysHigh")); 
        myQuote.setYearHigh(quote.getString("YearHigh")); 
        myQuote.setDaysLow(quote.getString("DaysLow")); 
        myQuote.setYearLow(quote.getString("YearLow")); 
        myQuote.setVolume(quote.getString("Volume")); 
        myQuote.setAverageDailyVolume(quote 
          .getString("AverageDailyVolume")); 
        myQuote.setPeRatio(quote.getString("PERatio")); 
        myQuote.setDividendYield(quote.getString("DividendYield")); 

        quotesAdapter.add(myQuote); 
       } 
      } 

      serializeQuotes(); 

     } catch (JSONException e) { 
      System.out.println(e); 
     } 
    } 

Répondre

0

l'erreur parle par lui-même: NullPointerException. Essayez juste de voir pourquoi obtenez-vous une valeur nulle là-bas, et essayez de l'attraper aussi ...

catch (JSONException e) { 
      System.out.println(e); 
} 
catch (NullPointerException n) { 
      // do something useful here 
} 
+0

Je peux empêcher le crash en attrapant l'exception nullpointer, mais à partir de la réponse ci-dessus, il semble que le système d'exploitation tue mon processus et ignore onCreate(). Comment puis-je gérer cela correctement? –

+0

Il ne saute pas onCreate() s'il tue le processus. Il faut * a * faireCreate() pour afficher l'activité en cours après cela, car il faudra créer l'activité. Il peut simplement créer des activités dans un ordre différent de celui d'origine, car elles ne sont créées que telles qu'elles sont affichées. Vous avez juste besoin de faire face à cela. (Et pour le commentaire original - juste attraper NullPointerException est au mieux un pansement si ce n'est pas carrément faux, le code doit juste traiter correctement les choses afin que cela n'arrive pas.) – hackbod

+0

est-il difficile de vérifier null dans onStart() ou onResume() et ré-initialiser là? –

3

J'ai rencontré des problèmes similaires plus tôt. Ce n'est pas qu'Android tue une variable, mais parce qu'au bout d'un certain temps, Android tue le processus, lorsque vous démarrez à nouveau le programme, le programme ne démarre pas sur la première activité, mais sur la dernière activité sur laquelle vous étiez. Par conséquent, vous pouvez obtenir certaines variables que vous avez généralement initialisées sur la première activité non initialisée.

+0

comment avez-vous résolu cela? –

+0

Initialisez les variables sur la fonction OnCreate de chaque activité, et pas seulement sur l'activité principale. – yuku