作者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
1F:推 givemepass:你是一次建立很多层 还是一次建一层? 12/01 00:16
这是大量的图片暂存
ImageLoader (网路下载图片→Memory Cache→File Cache)
然後显示在ImageView上
※ 编辑: Fonger 来自: 140.113.244.14 (12/01 00:20)
2F:→ janyfor:dir = contex.getCacheDir() -> NULL; NULL.exists() 12/01 01:33
3F:→ ted66:用try一下应该会比较快 12/01 01:43
4F:推 Assyla:遇过这种问题,清资料後,Cache资料夹变成空资料夹 12/01 02:15
5F:→ Assyla:但只是里面暂存档不见,资料夹本身还存在 12/01 02:16
6F:→ Assyla:也只能等重开机後消失 XD 12/01 02:16
7F:→ Fonger:然後只能请使用者重开机了 囧@@ 12/01 15:47
8F:→ Fonger: 使用者表示: 不爽 烂 ★☆☆☆☆ 12/01 19:23
9F:推 sdyy:用try吧 失败再用getDir() 12/01 20:09
10F:→ sdyy:上架就是要能接受一星 再好的APP都是有一星的 12/01 20:09
11F:推 gpc5566:推1星 12/01 22:14
12F:→ Fonger:楼上是5566化的gpc吗@@ 12/02 00:52