【问题标题】:Does Android kill local variables after some time?Android会在一段时间后杀死局部变量吗?
【发布时间】:2010-09-08 04:57:01
【问题描述】:

在我的设备上长时间使用后,我似乎遇到了崩溃:

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() 在我退出并恢复我的应用程序时似乎工作正常,但一段时间后失败......

我的应用程序中的第 457 行是 JSON“查询”对象:

/**
     * 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);
        }
    }

【问题讨论】:

    标签: java android crash nullpointerexception


    【解决方案1】:

    我之前遇到过类似的问题。不是Android杀死了某个变量,而是因为一段时间后Android杀死了进程,当您再次启动程序时,程序不是在第一个活动上启动,而是在您所在的最后一个活动上启动。因此,您可能会得到一些通常在第一个未初始化的活动时初始化的变量。

    【讨论】:

    • 初始化每个activity的onCreate上的变量,不仅仅是主activity。
    【解决方案2】:

    错误不言自明:NullPointerException。试着看看你为什么在那里得到一个空值,并试着抓住它......

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

    【讨论】:

    • 我可以通过捕获 nullpointerexception 来防止崩溃,但从上面的答案看来,操作系统正在杀死我的进程并跳过 onCreate()。我该如何正确处理?
    • 如果它终止进程,它不会跳过 onCreate() 。之后它必须执行 onCreate() 以显示当前活动,因为它需要创建活动。它只是可能以与最初不同的顺序创建活动,因为它们仅在显示时创建。你只需要处理这个。 (对于最初的评论——如果不是完全错误的话,仅仅捕捉 NullPointerException 充其量只是一个创可贴;代码只需要正确处理事情,这样就不会发生这种情况。)
    • 在 onStart() 或 onResume() 中检查 null 并在那里重新初始化是否很麻烦?
    • 一点也不...事实上这就是你必须做的:D
    猜你喜欢
    • 2021-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-29
    • 2011-08-29
    • 1970-01-01
    • 1970-01-01
    • 2017-06-17
    相关资源
    最近更新 更多