[問題] 奇怪的bug get(External)CacheDir() 回傳NULL
最近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
12/01 01:33, 2F
→
12/01 01:43, , 3F
12/01 01:43, 3F
推
12/01 02:15, , 4F
12/01 02:15, 4F
→
12/01 02:16, , 5F
12/01 02:16, 5F
→
12/01 02:16, , 6F
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
12/01 20:09, 9F
→
12/01 20:09, , 10F
12/01 20:09, 10F
推
12/01 22:14, , 11F
12/01 22:14, 11F
→
12/02 00:52, , 12F
12/02 00:52, 12F