Android 在扫描U盘解析图片缩略图时,拔出U盘导致崩溃

在Android设备中,扫描U盘解析图片缩略图时若拔出U盘,可能导致应用崩溃。崩溃原因在于U盘操作过程中,系统kill了占用文件的进程。解决方法包括屏蔽信号、释放资源或在独立进程中处理。具体解决策略涉及JNI重写信号处理、避免反射操作、确保文件占用及时关闭等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Android 在扫描U盘解析图片缩略图时,拔出U盘导致崩溃

  在出现该问题时,发现日志中显示processkiller:....相关信息,然后出现了进程被杀死的日志。

E/ProcessKiller( 2176): Process com.android.xxx (2866) has open file
xxxxxxxx
W/ProcessKiller( 2176): Sending SIGHUP to process 2866
I/ActivityManager( 2250): Process com.android.xxx(pid 2866) has died.

网上查询后发现是由于正在对U盘中的文件操作时,出,拔出U盘的时候,因为占用了U盘中的Test.apk文件,导致process被系统kill了,所以app就挂了。
那怎么解决这个问题呢?
有三种方法:
1.屏蔽信号 sighup,kill信号,自己接受信号并且自己来处理,默认情况下,接受了该信号,就会kill掉调用他的进程
2.找到还有哪里占用资源的地方,统统释放掉。
3.将该部分处理逻辑放到另外一个不相关的进程中去,这样,即使其进程被杀也不会影响到app的使用。
## 屏蔽信号 ##
系统层修改了vold类,当接受到这个信号以后不去进行处理kill的指令,或者屏蔽了我们项目的进程,可以达到效果,但是为了可移植性,添加其他方案,思路如下:
1.写JNI去重写该信号,自己接管这个信号,不去做kill的指令
2.从Java层找如上的方案,接管信号

http://blog.youkuaiyun.com/qq_21972057/article/details/44038313

## 释放占用

1. 首先,在你的 Android 应用程序中注册一个 BroadcastReceiver,来监听 U 拔出的事件。 2. 在 BroadcastReceiver 的 onReceive 方法中,取消所有缓存的图片。 3. 取消缓存图片的方法,可以通过清空 Glide、Picasso 等图片加载库的缓存,或者直接删除缓存文件夹中的文件来实现。 下面是一个简单的示例代码: ```java public class USBReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { String action = intent.getAction(); if (action.equals(Intent.ACTION_MEDIA_EJECT)) { // U 拔出,取消所有图片缓存 cancelImageCache(); } } private void cancelImageCache() { // 清空 Glide 缓存 Glide.get(mContext).clearMemory(); new Thread(new Runnable() { @Override public void run() { Glide.get(mContext).clearDiskCache(); } }).start(); // 清空 Picasso 缓存 Picasso.get().invalidate(); Picasso.get().memoryCache.clear(); Picasso.get().cache.clear(); // 删除缓存文件夹中的文件 File cacheDir = new File(mContext.getCacheDir(), "image"); if(cacheDir.exists()){ deleteDir(cacheDir); } } private void deleteDir(File dir) { if (dir.isDirectory()) { String[] children = dir.list(); for (int i = 0; i < children.length; i++) { deleteDir(new File(dir, children[i])); } } dir.delete(); } } ``` 在 AndroidManifest.xml 文件中注册 BroadcastReceiver: ```xml <receiver android:name=".USBReceiver"> <intent-filter> <action android:name="android.intent.action.MEDIA_EJECT"/> <data android:scheme="file"/> </intent-filter> </receiver> ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值