程序打印的錯誤日誌基本都是與Surface unlock相關,但程序並無操做Surface。看到日誌幾回打印:Looper﹕ Could not create wake pipe. errno=24,引發注意,猜測是讀寫文件報的錯誤。但沒有更多的錯誤信息,也就不知道是哪一個模塊讀寫文件。緩存
谷歌一下,說是網絡請求更多,且未關閉鏈接致使。估計是圖片加載致使。ViewPager中有20來個fragment,每一個fragment加載近百張圖片。滑動3-4輪,即顯示60,70次Fragment時,再次左右滑動,程序當即崩潰。使用Picasso做爲圖片加載引擎,爲了控制圖片內存中的緩存大小,使用本身配置的Builder,而不是默認的。本覺得是Picasso加載圖片的線程太多,但查看源碼,其線程池配置:線程數量爲3,並行數量也爲3。這個配置不會致使線程問題。自認爲不是Picasso引發的問題。網絡
問題陷入了死循環,這個頁面顯示大概70次Fragment程序依舊崩潰,日誌也一直打印:Looper﹕ Could not create wake pipe. errno=24。再次谷歌,點進一篇棧爆網的文章:http://stackoverflow.com/questions/17606111/a-looper-could-not-create-wake-pipe-errno-24。看完中間內容後,註釋了圖片加載的代碼,試了試,左右滑動,顯示的近百次Fragment程序依舊正常。把Picasso圖片加載中自定義的Buider註釋,使用默認的。再次打包安裝,顯示的近百次Fragment程序也依舊正常。終於知道bug的緣由:使用自定義的Builder,建立Picasso對象時,沒有作線程同步。致使出現了多個實例,而重用這些實例時Picasso出現Bug,致使程序崩潰。ide
最後,下載了Picasso的源碼,直接在源碼的Util類中修改了CacheSize,編譯再生成jar,引入工程。使用默認的Picasso來加載圖片,屢次測試,程序正常運行,且加載數百張圖片後,內存依舊在預期的範圍內。oop