感受SoftReference
2015-11-30 14:00
441 查看
强引用,可以看到内存占用了48M,内存基本没被回收
软引用,内存占有30M,内存多次被回收
附 GridView加载图片采用两种方式代码
当滚动让所有图片都显示一次后,再次滚动到任意位置时,采用强引用的会立即显示,采用软引用的不会立即显示,原因是采用软引用的被回收了,正在再次从文件中加载
软引用,内存占有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()); } } }
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件
- SourceProvider.getJniDirectories