看板 AndroidDev 關於我們 聯絡資訊
最近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
givemepass:你是一次建立很多層 還是一次建一層? 12/01 00:16
這是大量的圖片暫存 ImageLoader (網路下載圖片→Memory Cache→File Cache) 然後顯示在ImageView上 ※ 編輯: Fonger 來自: 140.113.244.14 (12/01 00:20)
janyfor:dir = contex.getCacheDir() -> NULL; NULL.exists() 12/01 01:33
ted66:用try一下應該會比較快 12/01 01:43
Assyla:遇過這種問題,清資料後,Cache資料夾變成空資料夾 12/01 02:15
Assyla:但只是裡面暫存檔不見,資料夾本身還存在 12/01 02:16
Assyla:也只能等重開機後消失 XD 12/01 02:16
Fonger:然後只能請使用者重開機了 囧@@ 12/01 15:47
Fonger: 使用者表示: 不爽 爛 ★☆☆☆☆ 12/01 19:23
sdyy:用try吧 失敗再用getDir() 12/01 20:09
sdyy:上架就是要能接受一星 再好的APP都是有一星的 12/01 20:09
gpc5566:推1星 12/01 22:14
Fonger:樓上是5566化的gpc嗎@@ 12/02 00:52