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


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

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

		// TODO Auto-generated method stub
		if (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 stub
		Options options = new Options();
		options.inJustDecodeBounds = true;
		BitmapFactory.decodeFile(string, options);
		
		return options;
	}


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

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

Demo地址

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值