感受SoftReference


强引用,可以看到内存占用了48M,内存基本没被回收



软引用,内存占有30M,内存多次被回收


附 GridView加载图片采用两种方式代码

当滚动让所有图片都显示一次后,再次滚动到任意位置时,采用强引用的会立即显示,采用软引用的不会立即显示,原因是采用软引用的被回收了,正在再次从文件中加载

package com.example.imageloader;

import java.util.ArrayList;

import android.R.bool;
import android.content.ContentResolver;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.provider.MediaStore;
import android.support.v7.app.ActionBarActivity;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AbsListView;
import android.widget.AbsListView.OnScrollListener;
import android.widget.Adapter;
import android.widget.BaseAdapter;
import android.widget.GridView;
import android.widget.ImageView;
import android.widget.ImageView.ScaleType;

public class MainActivity extends ActionBarActivity {

	boolean isStop=true;
	GridView gridView;
	int width;
	BaseAdapter adapter;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		gridView=(GridView) findViewById(R.id.grid);

	    width = getWindowManager().getDefaultDisplay().getWidth()/3;
	    System.out.println("宽 。。"+width);
		final ArrayList<String> listImage = new ArrayList<String>();
		// 扫描外部设备中的照片
		String str[] = { MediaStore.Images.Media._ID,
		MediaStore.Images.Media.DISPLAY_NAME,
		MediaStore.Images.Media.DATA};
		Cursor cursor = getContentResolver().query(
		MediaStore.Images.Media.EXTERNAL_CONTENT_URI, str,
		null, null, null);
		 
		
		

		
		
		while (cursor.moveToNext()) {

			int i=cursor.getColumnIndex(MediaStore.Images.Media.DATA);
			listImage.add(cursor.getString(i));

		}
		
		gridView.setOnScrollListener(new OnScrollListener() {
			
			@Override
			public void onScrollStateChanged(AbsListView view, int scrollState) {
				// TODO Auto-generated method stub
				if (scrollState==OnScrollListener.SCROLL_STATE_IDLE) {
					System.out.println("stop....");
					isStop=true;
					adapter.notifyDataSetChanged();
				}else{
					isStop=false;
					System.out.println("scrolling...");
				}
			}
			
			@Override
			public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
				// TODO Auto-generated method stub
				
			}
		});

		adapter=new BaseAdapter() {

			@Override
			public View getView(int position, View convertView, ViewGroup parent) {
				System.out.println("posi="+position);
				ImageView imageView;
				if (convertView==null) {
					imageView=new ImageView(getApplicationContext());
					imageView.setScaleType(ScaleType.CENTER_CROP);
					GridView.LayoutParams params=new AbsListView.LayoutParams(width,width);
					imageView.setLayoutParams(params);
				}else
					imageView=(ImageView) convertView;
				imageView.setImageBitmap(null);
				if (isStop) {
					XImageLoader.load(imageView, width, width, listImage.get(position));
				}
				// TODO Auto-generated method stub
				return imageView;
			}

			@Override
			public long getItemId(int position) {
				// TODO Auto-generated method stub
				return 0;
			}

			@Override
			public Object getItem(int position) {
				// TODO Auto-generated method stub
				return null;
			}

			@Override
			public int getCount() {
				// TODO Auto-generated method stub
				return listImage.size();
			}
		};
		gridView.setAdapter(adapter);
		
	}


}

package com.example.imageloader;

import java.lang.ref.SoftReference;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.Executor;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

import android.R.menu;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.BitmapFactory.Options;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.widget.ImageView;

public class XImageLoader {

	/**
	 * 强引用测试
	 */
//	static Map<String,Bitmap> bitmaps = new HashMap<>();

    /**
	 * 软引用测试
	 */
	static Map<String, SoftReference<Bitmap>> bitmaps = new HashMap<>();

	static Executor executor;
	static Handler handler;
	static{
		executor=Executors.newFixedThreadPool(6);
		handler=new Handler(Looper.getMainLooper()){
			
			@Override
			public void handleMessage(Message msg) {
				// TODO Auto-generated method stub
				super.handleMessage(msg);
				
				
				Bundle bundle=msg.getData();
				
				ImageView imageView=(ImageView) msg.obj;
				
				Bitmap bitmap=bundle.getParcelable("bitmap");
				
				imageView.setImageBitmap(bitmap);
			}
			
			
		};
		
	}
/**
 * 使用强引用
 */
//	public static void load(final ImageView imageView, final int width, final int height, final String uri) {
//		if (bitmaps.get(uri) == null) {
//
//			executor.execute(new Runnable() {
//
//				@Override
//				public void run() {
//					// TODO Auto-generated method stub
//					BitmapFactory.Options options = new Options();
//					options.inJustDecodeBounds = true;
//					BitmapFactory.decodeFile(uri, options);
//
//					int h = options.outHeight;
//					int w = options.outWidth;
//
//					int size = 1;
//
//					while (w > width || h > height) {
//						w = w / 2;
//						h = h / 2;
//						size*=2;
//					}
//
//					System.out.print("   ///size="+size);
//					options.inJustDecodeBounds = false;
//					options.inSampleSize = size;
//					options.inPreferredConfig= Bitmap.Config.RGB_565;
//					Bitmap bitmap=BitmapFactory.decodeFile(uri, options);
//					System.out.println("daxiao ="+bitmap.getAllocationByteCount());
//					System.out.println("size="+size+" ,,,bitmap width="+bitmap.getWidth()+" ..bmp height="+bitmap.getHeight());
//
//					bitmaps.put(uri, bitmap);
					bitmaps.put(uri, new SoftReference(bitmap));
//					Message message=Message.obtain();
//
//					Bundle data=new Bundle();
//					data.putParcelable("bitmap", bitmap);
//					message.setData(data);
//					message.obj=imageView;
//					handler.sendMessage(message);
//				}
//			});
//
//
//
//
//		} else {
//			imageView.setImageBitmap(bitmaps.get(uri));
//		}
//	}


	/**
	 * 使用软引用
	 * @param imageView
	 * @param width
	 * @param height
     * @param uri
     */
	public static void load(final ImageView imageView, final int width, final int height, final String uri) {
		if (bitmaps.get(uri) == null
				||bitmaps.get(uri).get()==null) {

			executor.execute(new Runnable() {

				@Override
				public void run() {
					// TODO Auto-generated method stub
					BitmapFactory.Options options = new Options();
					options.inJustDecodeBounds = true;
					BitmapFactory.decodeFile(uri, options);

					int h = options.outHeight;
					int w = options.outWidth;

					int size = 1;

					while (w > width || h > height) {
						w = w / 2;
						h = h / 2;
						size*=2;
					}


					System.out.print("   ///size="+size);
					options.inJustDecodeBounds = false;
					options.inSampleSize = size;
					options.inPreferredConfig= Bitmap.Config.RGB_565;
					Bitmap bitmap=BitmapFactory.decodeFile(uri, options);
					System.out.println("daxiao ="+bitmap.getAllocationByteCount());
					System.out.println("size="+size+" ,,,bitmap width="+bitmap.getWidth()+" ..bmp height="+bitmap.getHeight());
                                        //软引用

					bitmaps.put(uri, new SoftReference(bitmap));
					Message message=Message.obtain();

					Bundle data=new Bundle();
					data.putParcelable("bitmap", bitmap);
					message.setData(data);
					message.obj=imageView;
					handler.sendMessage(message);
				}
			});




		} else {
			imageView.setImageBitmap(bitmaps.get(uri).get());
		}
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值