感受SoftReference

来源:互联网 发布:html5仿淘宝选择地址 编辑:程序博客网 时间:2024/06/06 00:02


强引用,可以看到内存占用了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;@Overrideprotected 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() {@Overridepublic void onScrollStateChanged(AbsListView view, int scrollState) {// TODO Auto-generated method stubif (scrollState==OnScrollListener.SCROLL_STATE_IDLE) {System.out.println("stop....");isStop=true;adapter.notifyDataSetChanged();}else{isStop=false;System.out.println("scrolling...");}}@Overridepublic void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {// TODO Auto-generated method stub}});adapter=new BaseAdapter() {@Overridepublic 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);}elseimageView=(ImageView) convertView;imageView.setImageBitmap(null);if (isStop) {XImageLoader.load(imageView, width, width, listImage.get(position));}// TODO Auto-generated method stubreturn imageView;}@Overridepublic long getItemId(int position) {// TODO Auto-generated method stubreturn 0;}@Overridepublic Object getItem(int position) {// TODO Auto-generated method stubreturn null;}@Overridepublic int getCount() {// TODO Auto-generated method stubreturn 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()){@Overridepublic void handleMessage(Message msg) {// TODO Auto-generated method stubsuper.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() {@Overridepublic void run() {// TODO Auto-generated method stubBitmapFactory.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());}}}


0 0