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

Posted xzj_2013

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android 在扫描U盘解析图片缩略图时,拔出U盘导致崩溃相关的知识,希望对你有一定的参考价值。

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.csdn.net/qq_21972057/article/details/44038313

## 释放占用资源需要注意点 ##
1.方法的调用尽量不要涉及到反射之类的方法,因为这类的方法会导致无法解除对文件的占用
2.确认是否在该方法中是否卡住,比如在部分系统上BitmapFactory.decodeStream方法,在拔出U盘时会卡住,这时候就需要把该方法放到线程中,手动去把线程干掉,业如果整个方法卡住不往下执行,那么就无法执行到你解除文件占用的代码。
3. 最后才是把对文件的占用的对象close掉解除占用。

以上是关于Android 在扫描U盘解析图片缩略图时,拔出U盘导致崩溃的主要内容,如果未能解决你的问题,请参考以下文章

linux下U盘状态检测

解决win11/win10无法安全拔出移动硬盘的问题 - U盘无法“安全删除并弹出媒体”

MediaScanner-MediaPrivider-插拔U盘多媒体扫描并优化

怎样用u盘制作win7系统安装win7系统

USBLogView(U S B 记录查看器)

U盘数据丢失用恢复软件能找回吗?