作者Fonger (MereFantasy)
看板AndroidDev
標題[問題] 奇怪的bug
時間Sat Nov 30 22:43:32 2013
最近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