[問題] 奇怪的bug get(External)CacheDir() 回傳NULL

看板AndroidDev作者 (MereFantasy)時間12年前 (2013/11/30 22:43), 編輯推噓4(408)
留言12則, 7人參與, 最新討論串1/1
最近APP使用者突然急遽增加 但是越來越多人之後 發現了一個全新的BUG.. 而且回報次數越來越多 public static File getCacheDir(Context context) { File dir; if(isExternalStorageWritable()) dir = context.getExternalCacheDir(); else dir = context.getCacheDir(); if(!dir.exists()) 問題出在這一行! Core.java: 84 dir.mkdirs(); return dir; } public static boolean isExternalStorageWritable() { return Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState()); } 後來在國外查到資料也有很多人遇到奇怪的Bug getExternalCacheDir() 或是 getCacheDir() 回傳NULL 常常發生在清除CACHE或是第三方清除暫存檔的APP清除之後發生 照理說清除Cache後,Cache資料夾不見是正常的,所以我才會加入dir.mkdirs()這行 國外找到的資料解決辦法就是重開機就正常了....囧 另外context我確定是正常的 不是NULL 因為是在UI裡面呼叫ThreadPool去執行的 而且如果context是NULL,那麼應該在context.getExternalCacheDir()就回報 NullPointerException錯誤才對... 國外甚至還有人說Environment.getExternalStorageDirectory() 就算通過getExternalStorageState 確定MOUNTED後 也會莫名其妙回報NULL.. 我發現回報這個BUG的人的機型 通常都是不知道哪牌的手機 如Qilive 53 (msm8625) (連google都goo不到QAQ) 不然就是 舊款或非旗艦機型的Galaxy S, Xperia J等等 我的APP評論下面還有人說 「對於二線品牌手機支援都度不足」... 這種問題要怎麼解...還是說這是Android 碎片化的宿命@@ 以下是Bug內容 java.lang.RuntimeException: An error occured while executing doInBackground() at android.os.AsyncTask$3.done(AsyncTask.java:200) at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:274) at java.util.concurrent.FutureTask.setException(FutureTask.java:125) at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:308) at java.util.concurrent.FutureTask.run(FutureTask.java:138) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1088) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:581) at java.lang.Thread.run(Thread.java:1019) Caused by: java.lang.NullPointerException at com.xxxxxx.yyyyyy.Core.getCacheDir(Core.java:84) at com.xxxxxx.my_imageloader.FileCache.<init>(FileCache.java:12) at com.xxxxxx.my_imageloader.ImageLoader.<init>(ImageLoader.java:37) at com.xxxxxx.yyyyyy.WatchingListAdapter.<init>(WatchingListAdapter.java:37) at com.xxxxxx.yyyyyy.WatchingListFragment$LoadWatchUserAsync.doInBackground(WatchingListFragment.java:81) at com.xxxxxx.yyyyyy.WatchingListFragment$LoadWatchUserAsync.doInBackground(WatchingListFragment.java:1) at android.os.AsyncTask$2.call(AsyncTask.java:185) at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:306) ... 4 more -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.113.244.14

12/01 00:16, , 1F
你是一次建立很多層 還是一次建一層?
12/01 00:16, 1F
這是大量的圖片暫存 ImageLoader (網路下載圖片→Memory Cache→File Cache) 然後顯示在ImageView上 ※ 編輯: Fonger 來自: 140.113.244.14 (12/01 00:20)

12/01 01:33, , 2F
dir = contex.getCacheDir() -> NULL; NULL.exists()
12/01 01:33, 2F

12/01 01:43, , 3F
用try一下應該會比較快
12/01 01:43, 3F

12/01 02:15, , 4F
遇過這種問題,清資料後,Cache資料夾變成空資料夾
12/01 02:15, 4F

12/01 02:16, , 5F
但只是裡面暫存檔不見,資料夾本身還存在
12/01 02:16, 5F

12/01 02:16, , 6F
也只能等重開機後消失 XD
12/01 02:16, 6F

12/01 15:47, , 7F
然後只能請使用者重開機了 囧@@
12/01 15:47, 7F

12/01 19:23, , 8F
使用者表示: 不爽 爛 ★☆☆☆☆
12/01 19:23, 8F

12/01 20:09, , 9F
用try吧 失敗再用getDir()
12/01 20:09, 9F

12/01 20:09, , 10F
上架就是要能接受一星 再好的APP都是有一星的
12/01 20:09, 10F

12/01 22:14, , 11F
推1星
12/01 22:14, 11F

12/02 00:52, , 12F
樓上是5566化的gpc嗎@@
12/02 00:52, 12F
文章代碼(AID): #1IcVcQdk (AndroidDev)