ImageLoader: java.io.FileNotFoundException: /storage/sdcard0/Android/data/[...]/cache/uil-images/jo
16lz
2021-12-04
插拔SD卡出现:
01-23 15:48:00.512 2385 2385 E ImageLoader: /storage/sdcard0/Android/data/com.android.customerservice/cache/uil-images/journal.tmp: open failed: EIO (I/O error)01-23 15:48:00.512 2385 2385 E ImageLoader: java.io.FileNotFoundException: /storage/sdcard0/Android/data/com.android.customerservice/cache/uil-images/journal.tmp: open failed: EIO (I/O error)01-23 15:48:00.512 2385 2385 E ImageLoader: at libcore.io.IoBridge.open(IoBridge.java:496)01-23 15:48:00.512 2385 2385 E ImageLoader: at java.io.FileOutputStream.(FileOutputStream.java:87)01-23 15:48:00.512 2385 2385 E ImageLoader: at java.io.FileOutputStream.(FileOutputStream.java:72)01-23 15:48:00.512 2385 2385 E ImageLoader: at com.nostra13.universalimageloader.cache.disc.impl.ext.DiskLruCache.rebuildJournal(DiskLruCache.java:358)01-23 15:48:00.512 2385 2385 E ImageLoader: at com.nostra13.universalimageloader.cache.disc.impl.ext.DiskLruCache.open(DiskLruCache.java:250)01-23 15:48:00.512 2385 2385 E ImageLoader: at com.nostra13.universalimageloader.cache.disc.impl.ext.LruDiskCache.initCache(LruDiskCache.java:112)01-23 15:48:00.512 2385 2385 E ImageLoader: at com.nostra13.universalimageloader.cache.disc.impl.ext.LruDiskCache.(LruDiskCache.java:106)01-23 15:48:00.512 2385 2385 E ImageLoader: at com.nostra13.universalimageloader.core.DefaultConfigurationFactory.createDiskCache(DefaultConfigurationFactory.java:89)01-23 15:48:00.512 2385 2385 E ImageLoader: at com.nostra13.universalimageloader.core.ImageLoaderConfiguration$Builder.initEmptyFieldsWithDefaultValues(ImageLoaderConfiguration.java:580)01-23 15:48:00.512 2385 2385 E ImageLoader: at com.nostra13.universalimageloader.core.ImageLoaderConfiguration$Builder.build(ImageLoaderConfiguration.java:559)01-23 15:48:00.512 2385 2385 E ImageLoader: at com.android.customerservice.activity.UserFeedbackChildActivity.onCreate(UserFeedbackChildActivity.java:160)01-23 15:48:00.512 2385 2385 E ImageLoader: at android.app.Activity.performCreate(Activity.java:6100)01-23 15:48:00.512 2385 2385 E ImageLoader: at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1112)01-23 15:48:00.512 2385 2385 E ImageLoader: at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2481)01-23 15:48:00.512 2385 2385 E ImageLoader: at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2614)01-23 15:48:00.512 2385 2385 E ImageLoader: at android.app.ActivityThread.access$800(ActivityThread.java:178)01-23 15:48:00.512 2385 2385 E ImageLoader: at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1470)01-23 15:48:00.512 2385 2385 E ImageLoader: at android.os.Handler.dispatchMessage(Handler.java:111)01-23 15:48:00.512 2385 2385 E ImageLoader: at android.os.Looper.loop(Looper.java:194)01-23 15:48:00.512 2385 2385 E ImageLoader: at android.app.ActivityThread.main(ActivityThread.java:5643)01-23 15:48:00.512 2385 2385 E ImageLoader: at java.lang.reflect.Method.invoke(Native Method)01-23 15:48:00.512 2385 2385 E ImageLoader: at java.lang.reflect.Method.invoke(Method.java:372)01-23 15:48:00.512 2385 2385 E ImageLoader: at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:960)01-23 15:48:00.512 2385 2385 E ImageLoader: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755)01-23 15:48:00.512 2385 2385 E ImageLoader: Caused by: android.system.ErrnoException: open failed: EIO (I/O error)01-23 15:48:00.512 2385 2385 E ImageLoader: at libcore.io.Posix.open(Native Method)01-23 15:48:00.512 2385 2385 E ImageLoader: at libcore.io.BlockGuardOs.open(BlockGuardOs.java:186)01-23 15:48:00.512 2385 2385 E ImageLoader: at libcore.io.IoBridge.open(IoBridge.java:482)01-23 15:48:00.512 2385 2385 E ImageLoader: ... 23 more
软件包名为com.android.customerservice,在com.android.customerservice.activity.UserFeedbackChildActivity的onCreate()方法中进行ImageLoader配置:
ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(this) .threadPriority(Thread.NORM_PRIORITY - 2)//设置当前线程的优先级 .denyCacheImageMultipleSizesInMemory() .diskCacheFileNameGenerator(new Md5FileNameGenerator())//使用MD5对UIL进行加密命名 .diskCacheSize(100 * 1024 * 1024)// sd卡(本地)缓存的最大值 .tasksProcessingOrder(QueueProcessingType.LIFO)//后进先出 .build();
在UserFeedbackChildActivity页面时插拔SD卡,会闪退(必现),这是因为缓存路径会随着SD卡的插拔发生改变,在项目配置mk文件ProjectConfig.mk中有一个值MTK_2SDCARD_SWAP = yes/no,这个值可以通过反射得到:
public static String getSwap() { Object result = null; try { Class cl = Class.forName("android.os.SystemProperties"); Object invoker = cl.newInstance(); Method m = cl.getMethod("get", new Class[] { String.class, String.class }); result = m.invoke(invoker, new Object[] { "ro.mtk_2sdcard_swap", "unknown" }); return (String) result; } catch (Exception e) { e.printStackTrace(); } return (String) result; }
若MTK_2SDCARD_SWAP = yes,则插上SD卡,其路径为/storage/sdcard0,手机内置SD卡路径为/storage/sdcard1,若拔出SD卡,则手机内置SD卡路径会变为/storage/sdcard0。路径的改变会导致FileNotFoundException,进一步导致其他异常。
更多相关文章
- android下giflib
- Android(安卓)Universal Image Loader 源码分析
- android 通用的功能集锦
- android之NDK(jni)开发笔记1——运行第一个NDK程序
- Android获取SD卡路径/内存的几种方法
- android app 缓存 ---- android 文件缓存使用流程解析
- Android主流三方库源码分析(一、深入理解OKHttp源码)
- Facebook推出强大Android图片库Fresco 自动释放内存 图片缓存 内
- 【Android(安卓)内存优化】Bitmap 硬盘缓存 ( Google 官方 Bitma