智慧北京之堆棧溢出

在學習智慧北京新聞客戶端的時候,在加載新聞中心list頁面圖片時,出現了堆棧內存溢出的問題,報錯信息如下:

08-06 07:34:42.222: E/AndroidRuntime(807): FATAL EXCEPTION: main
08-06 07:34:42.222: E/AndroidRuntime(807): java.lang.stackoverflowerror
08-06 07:34:42.222: E/AndroidRuntime(807):  at android.view.View.invalidate(View.java:8429)
08-06 07:34:42.222: E/AndroidRuntime(807):  at android.widget.TextView.invalidateDrawable(TextView.java:4573)
08-06 07:34:42.222: E/AndroidRuntime(807):  at android.graphics.drawable.DrawableContainer.invalidateDrawable(DrawableContainer.java:241)
08-06 07:34:42.222: E/AndroidRuntime(807):  at android.graphics.drawable.Drawable.invalidateSelf(Drawable.java:350)
08-06 07:34:42.222: E/AndroidRuntime(807):  at android.graphics.drawable.NinePatchDrawable.setAlpha(NinePatchDrawable.java:206)
08-06 07:34:42.222: E/AndroidRuntime(807):  at android.graphics.drawable.DrawableContainer.jumpToCurrentState(DrawableContainer.java:170)
08-06 07:34:42.222: E/AndroidRuntime(807):  at android.view.View.jumpDrawablesToCurrentState(View.java:11557)
08-06 07:34:42.222: E/AndroidRuntime(807):  at android.widget.TextView.jumpDrawablesToCurrentState(TextView.java:4507)
08-06 07:34:42.222: E/AndroidRuntime(807):  at android.view.ViewGroup.jumpDrawablesToCurrentState(ViewGroup.java:5009)
08-06 07:34:42.222: E/AndroidRuntime(807):  at android.view.ViewGroup.jumpDrawablesToCurrentState(ViewGroup.java:5009)
08-06 07:34:42.222: E/AndroidRuntime(807):  at android.widget.FrameLayout.jumpDrawablesToCurrentState(FrameLayout.java:172)
08-06 07:34:42.222: E/AndroidRuntime(807):  at android.view.ViewGroup.jumpDrawablesToCurrentState(ViewGroup.java:5009)

在網上找了一些資料看了,知道出現這種堆棧溢出一般就是死循環調用導致,不然就是層次關係嵌套太深。自己在代碼裏面找了半天,居然沒有看出哪裏使用了循環,層次關係嵌套也不深啊!我要崩潰了,無從下手,不知道怎麼弄了。後來問了一個工作的師兄,恰好師兄出去了,沒開電腦,只能把報錯信息粘過去請教,打斷點,一點一點的調試,最後確定在返回的view對象有問題,然後加到viewpager中顯示就出現了上面的錯誤,找了一下也沒找出view哪裏不對,最後發現addview(view)中的view居然是父類中的視圖,因爲另一個子類也繼承了父類,視圖是自己實現的,而當前類也繼承了同一父類,相當於addview的時候add了自己,這才導致了堆棧溢出。所以問題就出現在獲取view對象這裏。

當前類和NewsCenerListPager繼承了同一父類,getRootView()是子類自己實現的。

    //  加載新聞頁面的數據
        NewsCenterNewsItemBean bean = mPagerData.get(position);
        // 獲取數據
        NewsCenerListPager newsPager=new NewsCenerListPager(mContext,bean);
        //加載視圖
        View view=getRootView();

        //TODO  圖片視圖加載不上去
        container.addView(view);

        //加載數據
        newsPager.initData();
        return view;

正確代碼改爲:如下

    //  加載新聞頁面的數據
        NewsCenterNewsItemBean bean = mPagerData.get(position);
        // 獲取數據
        NewsCenerListPager newsPager=new NewsCenerListPager(mContext,bean);
        //加載視圖
        View view=newsPager.getRootView();

        //TODO  圖片視圖加載不上去
        container.addView(view);

        //加載數據
        newsPager.initData();
        return view;

看到沒有,就一個單詞的差別,花費了了半天的。沒有newsPager就是相當於自己add自己了。

發佈了40 篇原創文章 · 獲贊 9 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章