jincheng zhanyong

命令:

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相关的内存以及关掉文件描述符,这样进程就不会继续占用删除的图片


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值