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);
}
}
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? –
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
est-il difficile de vérifier null dans onStart() ou onResume() et ré-initialiser là? –