android 加载图片防止内存溢出

原创 2013年12月02日 19:38:13

图片资源:


private int fore[];
private int back[];
fore = new int[]{R.drawable.a0, R.drawable.a1, R.drawable.a2,
				R.drawable.a3, R.drawable.a4, R.drawable.a5,
				R.drawable.a6, R.drawable.a7, R.drawable.a8,
				R.drawable.a9, R.drawable.a910, R.drawable.a911,
				R.drawable.a912, R.drawable.a913, R.drawable.a914};
back = new int[]{R.drawable.b0, R.drawable.b1, R.drawable.b2,
				R.drawable.b3, R.drawable.b4, R.drawable.b5,
				R.drawable.b6, R.drawable.b7, R.drawable.b8,
				R.drawable.b9, R.drawable.b910, R.drawable.b911,
				R.drawable.b912, R.drawable.b913, R.drawable.b914};
//用户保存加载的图片
private List<Bitmap> bitmapResource = new ArrayList<BitMap>();
GridView grid;//声明 图片显示 类似九宫格 的 控件
Handler handler; //声明 Handler 用来传递消息




计算方法:

int width = (int) (getWindowManager().getDefaultDisplay().getWidth()/density);//取得屏幕的宽度 
ImageResource ir = new ImageResource();
//使用getPicture()方法 加载图片
 public void getPicture(){
    	new AsyncTask<Object, Object, Object>() {//	进度条类 异步处理
			@Override
			protected Object doInBackground(Object... params) {//后台执行,比较耗时的操作都可以放在这里。
				publishProgress();//来更新任务的进度。
				loadingBitmap(getResources(), width, 3);//对图片进行缩放的方法 ,这里3为要显示的列数
				return null;
			}


			@Override
			protected void onPostExecute(Object result) {//在doInBackground 执行完成后,onPostExecute 方法将被UI thread调用,后台的计算结果将通过该方法传递到UI thread. 
				handler.removeCallbacks(update);//removeCallbacks方法是删除指定的Runnable对象,使线程对象停止运行。
				message.setVisibility(View.GONE);//message设置为不可见
				author_message.setVisibility(View.GONE);//author_message设置为不可见
				grid.setVisibility(View.VISIBLE);//grid设置为可见
				grid.setNumColumns(3);//设置GridView的列数
				grid.setHorizontalSpacing(20);//两列之间的间距
				grid.setVerticalSpacing(40);//两行之间的间距
				grid.setAdapter(adapter);//使用适配器
				grid.setOnItemClickListener(new OnItemClickListener() {//GridView 的监听器
					
					public void onItemClick(AdapterView<?> arg0, View arg1,
							int position, long arg3) {
						Intent intent = new Intent();//实例化Intent
						intent.setClass(MenuActivity.this, ShowActivity.class);//设置跳转路径
						Bundle bundle = new Bundle();//实例化Bundle类 传值
						bundle.putInt("num",position);//传 列表的 位置值 到ShowActivity
						intent.putExtras(bundle);//intent发送Bundle
						MenuActivity.this.startActivity(intent);//开始跳转
					}
				});
				adapter.notifyDataSetChanged();//在adapter的数据发生变化以后通知UI主线程根据新的数据重新画图。
				super.onPostExecute(result);
			}


			
			protected void onProgressUpdate(Object... values) {//在publishProgress方法被调用后,UI thread将调用这个方法从而在界面上展示任务的进展情况
				
				handler = new Handler();//实例化handler
				//显示加载进度
				handler.post(update);//根据线程来更新进度
				
				super.onProgressUpdate(values);
			}
		}.execute();//执行 异步操作
    }

public void loadingBitmap(Resources resources, int width, int num){


		BitmapFactory.Options opts = new BitmapFactory.Options();//BitmapFactory.Options这个类
		//仅返回图片的 宽高  这样就不会占用太多的内存,也就不会那么频繁的发生OOM了。
		opts.inJustDecodeBounds = true;//该值设为true那么将不返回实际的bitmap对象,不给其分配内存空间但是可以得到一些解码边界信息即图片大小等信息。
		Bitmap temp = BitmapFactory.decodeResource(resources, fore[0], opts);//加载图片 缩放 从fore【】中第一位开始
		int radio = (int) Math.ceil(opts.outWidth / (width*1.0 / num - 30));//向上取整 结果是7,得到缩放比例radio
		//Math.ceil(12.2)//返回13
		//Math.ceil(12.7)//返回13
		//Math.ceil(12.0)// 返回12
		opts.inSampleSize = radio;//属性值inSampleSize表示缩略图大小为原始图片大小的几分之一
		if(null != temp){
			temp.recycle();//回收
		}
		System.out.println(radio);
		
		opts.inJustDecodeBounds = false;//inJustDecodeBounds设为false,就可以根据已经得到的缩放比例得到自己想要的图片缩放图了。
		
		for(int i = 0; i < fore.length; i++){
			Bitmap bitmap = BitmapFactory.decodeResource(resources, fore[i], opts);//载入图片
			bitmapResource.add(bitmap);//循环添加到集合中
		}
	}
使用适配器:
 BaseAdapter adapter = new BaseAdapter() {
		
		
		public View getView(int position, View convertView, ViewGroup parent) {
			ImageView iv = new ImageView(MenuActivity.this);//显示任意图像
			iv.setMaxWidth(width / 3 - 30);//设置宽度
			iv.setAdjustViewBounds(true);//是否保持宽高比
			iv.setImageBitmap(ir.getIconBitmap(position));//设置图片 使用ImageResource类中集合当中的图片
			return iv;
		}
		
		@Override
		public long getItemId(int position) {//得到ID
			return position;
		}
		
		@Override
		public Object getItem(int arg0) {//得到位置
			return arg0;
		}
		
		@Override
		public int getCount() {//得到大小
			return ir.size();
		}
	};
Runnable update = new Runnable() {//实例化线程
		@Override
		public void run() {
			int progress = ir.getProgress();//得到文件的总大小
			if(null != message){
				message.setText("数据加载中("+progress+"%),请稍等……\n\n");//如果message不是空,就让显示文本
			}
			if(100 == progress){
				handler.removeCallbacks(update);//等于100 也即是说 加载完毕 就停止线程,也就是关闭此定时器
			} else {
				handler.postDelayed(update, 200);//使用PostDelayed方法,两秒后调用此Runnable对象,实际上也就实现了一个0.2s的一个定时器
			}
		}
	};



版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

Android加载图片,防止内存溢出

我们在编写Android程序的时候经常要用到许多图片,不同图片总是会有不同的形状、不同的大小,但在大多数情况下,这些图片都会大于我们程序所需要的大小。比如说系统图片库里展示的图片大都是用手机摄像头拍出...

Android 加载图片内存溢出解决方法

尽量不要使用setImageBitmap或setImageResource或BitmapFactory.decodeResource来设置一张大图, 因为这些函数在完成decode后,最终都是通过j...

Android 加载图片时出错,内存溢出

在Android里图片溢出,报错信息为以下内容: java.lang.outofmemoryerror Android的虚拟机是基于寄存器的Dalvik,它的最大堆大小一般是16M ,一般是8M。...

Android加载图片出现内存溢出的解决

一、尽量使用BitmapFactory.decodeStream    BitmapFactory.decodeResource 来设置图片资源要消耗更多的内存,如果程序中的图片资源很多的话,那...

Android加载图片内存溢出问题解决方法

这篇文章主要介绍了Android加载图片内存溢出问题解决方法,本文讲解使用BitmapFactory.Options解决内存溢出问题,需要的朋友可以参考下 1. 在Android...

Android加载图片内存溢出问题解决方法

1. 在Android软件开发过程中,图片处理是经常遇到的。 在将图片转换成Bitmap的时候,由于图片的大小不一样,当遇到很大的图片的时候会出现超出内存的问题,为了解决这个问题Android API...

解决Android加载图片时内存溢出的问题

尽量不要使用setImageBitmap或setImageResource或BitmapFactory.decodeResource来设置一张大图,因为这些函数在完成decode后,最终都是通过jav...

Android加载图片导致内存溢出(Out of Memory异常)

文章来源:http://zwkufo.blog.163.com/blog/static/2588251201312864034812/ Android在加载大背景图或者大量图片时,经常导致内存溢出(...

Android加载图片导致内存溢出(Out of Memory异常)

Android在加载大背景图或者大量图片时,经常导致内存溢出(Out of Memory  Error),本文根据我处理这些问题的经历及其它开发者的经验,整理解决方案如下(部分代码及文字出处无法考证)...

Android 加载图片内存溢出解决方法

尽量不要使用setImageBitmap或setImageResource或BitmapFactory.decodeResource来设置一张大图, 因为这些函数在完成decode后,最终都是通过j...
  • awp258
  • awp258
  • 2012-04-27 10:47
  • 1074
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)