Android应用开启图片加载和防止图片解析溢出的小例子

来源:互联网 发布:淘宝买药可靠吗 编辑:程序博客网 时间:2024/05/16 15:06


        最近项目有了重新自动配置启动图片的需求,虽然没分到我,但是作为应用程序最常用到的功能,我还是比较有兴趣,加上最近还比较闲,也不怎么DOTA了,就写了一个相关功能实现的DEMO,DEMO写的比较粗略,甚至没有判断URLConnecttion的状态,大家主要看一下防止图片溢出和读写文件,以及异步刷新至主页的过程吧。

        先大致将一下流程,流程主要是先判断启动图片文件夹有没有下载成功的图片,如果没有,启动下载图片任务,并直接进行把图片读写至SDCARD,

// TODO Auto-generated method stubif (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){File sd = Environment.getExternalStorageDirectory();String _Path =  sd.getPath() + "/loadImg";File _file = new File(_Path);Log.d(TAG,"LoadingImgBackground Start:"+_Path);//如果不存在,则新建文件夹,并且开启工具类下载启动图片if (! _file.exists()){_file.mkdir();Utility.getInstance().downLoadImg();}//如果存在文件夹,则查找文件夹里面有没有现成的文件else{//如果文件夹里面有文件,则解析图片,并加载if(_file.list().length >0){String[] _FileName = _file.list();Bitmap localDrawable = Utility.getDrawableFromFile(sd.getPath() + "/loadImg/"+_FileName[0]);if(localDrawable != null){m_imgWelcome.setImageBitmap(localDrawable);}else{Utility.getInstance().downLoadImg();m_imgWelcome.setBackground(getResources().getDrawable(R.drawable.welcomeimg));}}//SD卡文件夹没有文件的话也去下载else{m_imgWelcome.setBackground(getResources().getDrawable(R.drawable.welcomeimg));Utility.getInstance().downLoadImg();}}}//如果没有SD卡直接加载默认图片else{m_imgWelcome.setBackground(getResources().getDrawable(R.drawable.welcomeimg));}m_handlerForLoading.postDelayed(this, 3000);


以上主要是配置启动图片的函数,设置好背景图片后,启动handler,推迟3秒钟跳到主ACTIVITY,下面再看看另一个主要的关键点,解析图片,防止OOM,图片OOM主要是因为图片太大以及DPI过高,我这里询问过公司UED的同事,会不会有图片小例如300X300,文件大小却超过2M的情况,得到的答案以及实践操作结果,是不存在的,因而可以认为图片OOM的主要原因是图片尺寸过大造成的,在这里需要特别注意一个属性options.inJustDecodeBounds,查看SDK文档

public boolean inJustDecodeBounds

Added in API level 1

If set to true, the decoder will return null (no bitmap), but the out... fields will still be set, allowing the caller to query the bitmap without having to allocate the memory for its pixels.

可以明显看到,当option的这个属性为true时,可以对图片进行预处理,即不分配内存也可以读出图片的尺寸,这个就很明显了,我们可以先预读出图片的尺寸,再确定缩放比例的计算,就可以避免OOM的出现,这里是通过函数 

private static Options getOptions(String string) {// TODO Auto-generated method stubOptions options = new Options();options.inJustDecodeBounds = true;BitmapFactory.decodeFile(string, options);return options;}


先预读出解析使用的option,在配置新的option并设置缩放比属性inSampleSize完成的。

话不多说,附上免积分下载DEMO,运行后有福利哦。。

Demo地址

原创粉丝点击