1. 程式人生 > >解決fragment的子fragment中viewpager裡面的fragment不銷燬 反覆建立問題

解決fragment的子fragment中viewpager裡面的fragment不銷燬 反覆建立問題

 苦苦研究了很久, 以前遇到這頭疼的問題是 寫的廣播回撥高仿startactivyforresult 改成startfragmentforresult 結果 這個玩意導致支多次回撥,原因是原來的fragment並沒有銷燬 為什麼沒用為什麼不走destory 真的是記憶體洩露嗎? 為什麼 destoryItem都不走,又怎麼走destory()登出廣播的方法,但是非常煩躁,結果 放棄使用廣播 實現非同步通訊 。用eventbus,但是實際上這個問題還是存在的。
時間過去了很久 再一次 的時候我心血來潮 再次檢視 介面卡的原始碼和viewpger的原始碼 。終於弄出了一套完美無bug的解決方法。
在返回鍵 或其他關閉veiwapger那個介面行為的時候先呼叫 ,然後 彈棧 。就可以 讓它成功呼叫。
FragmentStatePagerAdapter
使用這種 會導致反覆建立,一直緩衝著
FragmentPagerAdapter
使用這種 則一直快取著雖然下次進入子fragment然後viewpager讀取的還是原來的。 如果使用緩衝view的basefragment的寫法 那麼第二次開啟這個頁面會出現空白,這個可以使用每次繪製的方法單獨解決此問題。
而我這裡是做到 讓viewpager維護的fragment 手動控制其銷燬。 
 try {
            //可能出現 adapter內部維護的 list和我這裡的不一致
Field field = adapter.getClass().getSuperclass().getDeclaredField("mFragments"); field.setAccessible(true); ArrayList<Fragment> mFragments = (ArrayList<Fragment>) field.get(adapter);//false 則是不關閉mFragments if (mFragments != null) { for (int i = 0; i < mFragments.size(); i++) { adapter
.destroyItem(mViewPager, i, mFragments.get(i)); } adapter.finishUpdate(mViewPager);//提交事務 } // if(close){ // dialog.cancel(); // } } catch (Exception e) { }
這句話就完美讓viewpager裡面的fragment銷燬了
大家會嘲笑 我寫的怎麼就呼叫 destory() 因為你是用activity 維護的 activity裡面的viewpager自然使用自然正常啦!!
上面我之前嘗試 不用反射的寫法,但是 如果使用了setOffscreenPageLimit  那麼問題就大發了和裡面維護的 item 快取條目不一致 ,就會出現陣列越界。 在destoryItem裡面有一句程式碼叫   mFragments.set(position, null); 
所以 就會出現毛病,然後我直接把這句話刪除了,結果也有千分之一的機會出現 。
雖然解決了,但是這沒法解決多個tab之間 的問題 除非每個tab點選你就原來那邊維護的 銷燬,這太蛋疼了。  所以我首頁 沒弄,再說了首頁的這麼多tabhost選項卡里面的viewpger頁面選項卡 快取就快取首頁關閉 activity就關閉了 關閉了自然會呼叫onstory()
原始碼還沒看懂 為麼fragment+子fragment不走destoryItem方法。