由于在项目中有用到多图片的处理,这里的图片在60张以上,本篇所采取的案例均通过测试,在模拟器上都可以很流畅的使用。
本篇关键节点如下:
1、图片显示采取GridView控件,图片源头由res下drawable资源文件;
2、获取资源图片的时候采取AsyncTask进行操作;
3、图片缓存采取LinkedHashMap<Integer, Bitmap>,需要注意的是:
static LinkedHashMap<Integer, Bitmap> hard = new LinkedHashMap<Integer, Bitmap>(6, 0.75f, true);
4、进行手动内存回收,方式为在adapter 的getView里面进行主动回收,具体查看下面实例代码;
5、图片压缩采取 BitmapFactory.Options ,opt.inSampleSize = 4;
示例代码:
package com.demo.image;
import java.lang.reflect.Field;
import java.util.ArrayList;
import android.app.Activity;
import android.os.Bundle;
import android.widget.GridView;
import com.demo.R;
/**
* 目前在模拟器上都比较流畅,需要再加多图片试试 05-14
*
*
*
* @author Michael ku
*
* 2015-5-14 下午9:18:37
*/
public class DemoImage extends Activity {
final static int CWJ_HEAP_SIZE = 6 * 1024 * 1024;
public void onCreate(Bundle bun) {
super.onCreate(bun);
this.requestWindowFeature(1);
// 设置最小heap内存为6MB大小。当然对于内存吃紧来说还可以通过手动干涉GC去处理
// VMRuntime.getRuntime().setMinimumHeapSize(CWJ_HEAP_SIZE);
this.setContentView(R.layout.activity_demo_image);
grid = (GridView) this.findViewById(R.id.image_grid);
adapter = new ImageAdapter(this, getDatas());
grid.setAdapter(adapter);
}
ImageAdapter adapter;
public void onDestroy() {
super.onDestroy();
if (adapter.data != null) {
adapter.data.clear();
}
ImageAdapter.hard.clear();
}
private static ArrayList<Integer> getDatas() {
ArrayList<Integer> result = new ArrayList<Integer>();
Field[] fs = R.drawable.class.getDeclaredFields();
for (Field fi : fs) {
try {
result.add(fi.getInt(R.drawable.class));
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
return result;
}
GridView grid;
}// end
package com.demo.image;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import com.demo.R;
/**
*
*
*
*
* @author Michael ku
*
* 2015-5-14 下午9:19:48
*/
public class ImageAdapter extends BaseAdapter {
ArrayList<Integer> data;
private Activity base;
public ImageAdapter(Activity ac, ArrayList<Integer> srcs) {
this.data = srcs;
base = ac;
}
public int getCount() {
return data.size();
}
public Object getItem(int position) {
return data.get(position);
}
public long getItemId(int position) {
return position;
}
public View getView(int position, View convertView, ViewGroup parent) {
Holder holder = null;
if (convertView == null) {
convertView = base.getLayoutInflater().inflate(
R.layout.image_demo_item, null);
holder = new Holder(convertView);
convertView.setTag(holder);
} else {
holder = (Holder) convertView.getTag();
resetHolder(holder);
}
int resid = data.get(position);
if (resid > 0) {
if (hard.get(position) != null) {
holder.img.setImageBitmap(hard.get(position));
} else {
new Task(holder.img, position).execute(resid);
}
}
if (position % 7 == 6) {
System.gc();
}
return convertView;
}
static LinkedHashMap<Integer, Bitmap> hard = new LinkedHashMap<Integer, Bitmap>(
6, 0.75f, true);
private class Task extends AsyncTask<Integer, Void, Bitmap> {
int position;
ImageView image;
Task(ImageView img, int posi) {
position = posi;
image = img;
}
protected Bitmap doInBackground(Integer... params) {
Bitmap bm = BitmapFactory.decodeResource(base.getResources(),
params[0], getOpt());
hard.put(position, bm);
return bm;
}
protected void onPostExecute(Bitmap result) {
super.onPostExecute(result);
if (result != null) {
image.setImageBitmap(result);
}
}
}
static BitmapFactory.Options getOpt() {
BitmapFactory.Options opt = new BitmapFactory.Options();
opt.inSampleSize = 4;
return opt;
}
private void resetHolder(Holder ho) {
ho.img.setImageResource(0);
}
private class Holder {
ImageView img;
Holder(View view) {
img = (ImageView) view.findViewById(R.id.item_image);
}
}
}// end
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:orientation="vertical" >
<ImageView
android:id="@+id/item_image"
android:layout_width="80dip"
android:layout_height="80dip"
android:contentDescription="@string/app_name" />
</LinearLayout><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<GridView
android:id="@+id/image_grid"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:horizontalSpacing="10dip"
android:numColumns="auto_fit"
android:stretchMode="columnWidth"
android:columnWidth="80dip"
android:verticalSpacing="10dip" />
</LinearLayout>
资源文件,图片
测试虚拟机
上面这个是在网上看到的,我在测试的时候没有通过,提示找不到这个类,如果有知道的朋友,提示下呗!