您的位置:首页 > 移动开发 > Android开发

android 异步加载图片缩略图

2012-11-26 10:06 239 查看
建一个AsyncLoadedImage类继承AsyncTask异步加载类,调用publishProgress方法更新onProgressUpdate贮存缩略图信息到Adapter。监听Adapter Change实现异步加载缩略图。

main.xml

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<GridView
android:id="@+id/sdcard"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:gravity="center"
android:horizontalSpacing="10dp"
android:numColumns="auto_fit"
android:stretchMode="columnWidth"
android:verticalSpacing="10dp" />
</FrameLayout>


MFile.java

public class MFile extends Activity {
private GridView sdcardImages;
private FileAdapter fileAdapter;

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
setContentView(R.layout.main);

setupViews();
setProgressBarIndeterminateVisibility(true);
new AsyncLoadedImage().execute();
}

/*
* 释放Bitmap内存
*/
protected void onDestroy() {
super.onDestroy();
final GridView grid = sdcardImages;
final int count = grid.getChildCount();
ImageView v = null;
for (int i = 0; i < count; i++) {
v = (ImageView) grid.getChildAt(i);
((BitmapDrawable) v.getDrawable()).setCallback(null);
}
}

/*
* 初始化文件浏览View
*/
private void setupViews() {
sdcardImages = (GridView) findViewById(R.id.sdcard);
sdcardImages.setOnItemClickListener(new fileListener());
fileAdapter = new FileAdapter(getApplicationContext());
sdcardImages.setAdapter(fileAdapter);
}

/*
* 刷新Adapter
*/
private void addImage(LoadedImage... value) {
for (LoadedImage image : value) {
fileAdapter.addPhoto(image);
fileAdapter.notifyDataSetChanged();
}
}

/*
* 点击监听
*/
class fileListener implements OnItemClickListener {

@Override
public void onItemClick(AdapterView<?> paramAdapterView,
View paramView, int paramInt, long paramLong) {
}
}

/*
* 异步加载缩略图到LoadedImage然后调用addImage方法更新Adapter
*/
class AsyncLoadedImage extends AsyncTask<Object, LoadedImage, Object> {
@Override
protected Object doInBackground(Object... params) {
String path = Environment.getExternalStorageDirectory()
.getAbsolutePath() + "/hfdatabase/3/img";
File file = new File(path);
if (!file.exists()) {
file.mkdirs();
} else {
File[] files = file.listFiles();
String[] paths = new String[files.length];
Bitmap bitmap;
Bitmap newBitmap;
for (int i = 0; i < files.length; i++) {
paths[i] = files[i].getPath();
try {
BitmapFactory.Options options = new BitmapFactory.Options();
options.inSampleSize = 10;
bitmap = BitmapFactory.decodeFile(paths[i], options);
newBitmap = ThumbnailUtils.extractThumbnail(bitmap, 80,
);
bitmap.recycle();
if (newBitmap != null) {
publishProgress(new LoadedImage(newBitmap));
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
return null;
}

@Override
public void onProgressUpdate(LoadedImage... value) {
addImage(value);
}

@Override
protected void onPostExecute(Object result) {
setProgressBarIndeterminateVisibility(false);
}
}

/*
* Adapter
*/
class FileAdapter extends BaseAdapter {

private Context mContext;
private ArrayList<LoadedImage> photos = new ArrayList<LoadedImage>();

public FileAdapter(Context context) {
mContext = context;
}

public void addPhoto(LoadedImage photo) {
photos.add(photo);
}

public int getCount() {
return photos.size();
}

public Object getItem(int position) {
return photos.get(position);
}

public long getItemId(int position) {
return position;
}

public View getView(int position, View convertView, ViewGroup parent) {
final ImageView imageView;
if (convertView == null) {
imageView = new ImageView(mContext);
} else {
imageView = (ImageView) convertView;
}
imageView.setScaleType(ImageView.ScaleType.FIT_CENTER);
imageView.setPadding(8, 8, 8, 8);
imageView.setImageBitmap(photos.get(position).getBitmap());
return imageView;
}
}

/*
* 这是个保存bitmap的类,加入Adapter的ArrayList中,随着addImage更新Adapter
*/
private static class LoadedImage {
Bitmap mBitmap;

LoadedImage(Bitmap bitmap) {
mBitmap = bitmap;
}

public Bitmap getBitmap() {
return mBitmap;
}
}

/*
* 消息提示
*/
private Toast toast;

public void showMsg(String arg) {
if (toast == null) {
toast = Toast.makeText(this, arg, Toast.LENGTH_SHORT);
} else {
toast.cancel();
toast.setText(arg);
}
toast.show();
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: