您的位置:首页 > Web前端

感受SoftReference

2015-11-30 14:00 441 查看
强引用,可以看到内存占用了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());
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android