命令:
adb shell ls -l /proc/pid-num/fd 查看该进程所有打开的文件
在这里可以用这个查看gallery进程打开的文件
lsof(list open files)adb shell lsof > '/data/nishome/tdsw1/yaqin.tang/LOG/ss.txt'可以列出当前系统打开的文件
查看有几个进程占用了那张图片
1.这种问题根本原因是用这种方式打开这张被删除的图片后,有进程占用了这张图片,导致创建不了文件夹,所以无法拍照,通过蓝牙收到文件等。
用这种方式打开图片uri的格式:file:///storage/emulated/0/DCIM/Camera/IMG_20150106_191416.jpg,
在photopage.java中会通过UriImage(MediaItem)和SinglePhotoDataAdapter(Model)得到bitmap并显示
MediaItem mediaItem = (MediaItem)//UriImage
mActivity.getDataManager().getMediaObject(itemPath);
mModel = new SinglePhotoDataAdapter(mActivity, mPhotoView, mediaItem);
mPhotoView.setModel(mModel);
updateCurrentPhoto(mediaItem);
mShowSpinner = false;
2.解决这个问题就得看它是如何得到这张图片的bitmap
首先在PhotoPage.java中调用Model的resume方法,因为在SinglePhotoDataAdapter(Model)初始化的时候mHasFullImage为true,所以就会调用UriImage的requestLargeImage方法,
在这个方法里面用位置描述符(ParcelFileDescriptor)创建BitmapRegionDecoder(能用来解码一张图片的某个矩形区域,这个类一般用在图片过大而你又只需要该图片的一部分的时候),
mFileDescriptor = mApplication.getContentResolver()
.openFileDescriptor(mUri, "r");
BitmapRegionDecoder decoder = DecodeUtils.createBitmapRegionDecoder(
jc, mFileDescriptor.getFileDescriptor(), false);
在resume方法中当得到这个BitmapRegionDecoder后,mLargeListener就会被调用
mTask = mThreadPool.submit(
mItem.requestLargeImage(), mLargeListener);
在mLargeListener中就会用BitmapRegionDecoder.decodeRegion来获得该图片的不同区域的解码得到的bitmap
3.解决这个问题就是要释放与BitmapRegionDecoder相关的内存以及关掉文件描述符,这样进程就不会继续占用删除的图片
jincheng zhanyong
最新推荐文章于 2023-12-11 15:23:17 发布