android 图片 构建缩略图,android 异步加载图片缩略图

该博客主要介绍了一个Android应用中实现图片浏览的功能,包括使用GridView显示图片,通过AsyncTask异步加载缩略图,并进行内存管理。文章详细阐述了如何初始化GridView,设置点击事件,以及在内存不足时释放Bitmap资源的方法。此外,还讨论了如何从文件路径获取图片名称,并创建适配器更新UI。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

public class ImageGridView extends Activity{

private GridView sdcardImages;

private FileAdapter fileAdapter;

private Drawable drawable;

int flag=2;

String[] albums=null;

String[] paths ;

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);

setContentView(R.layout.grid_view);

setupViews();

setProgressBarIndeterminateVisibility(true);

paths = getNames(flag, albums);

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);

v.getDrawable().setCallback(null);

}

}

/*

* 初始化文件浏览View

*/

private void setupViews() {

Intent intent = getIntent();

final String path = intent.getStringExtra("path");

String name = intent.getStringExtra("name");

flag=intent.getIntExtra("flag",1);

albums=intent.getStringArrayExtra("data");

sdcardImages = (GridView) this.findViewById(R.id.gridview);

drawable =  sdcardImages.getBackground();

fileAdapter = new FileAdapter(getApplicationContext());

sdcardImages.setAdapter(fileAdapter);

sdcardImages.setOnItemClickListener(new OnItemClickListener(){

public void onItemClick(AdapterView> arg0, View arg1, int position,long id)

{

//Log.i("GridView.setOnItemClickListener", "position="+position);

//String path=images.get(position).path;

//Log.i("ImageListView_onListItemClick", "the path="+path);

ArrayList pathArray=new ArrayList();

for(int i=0; i

{

if(flag==2)

{

pathArray.add(albums[i]);

}

else

{

String absolutePath=albums[i].split("&")[1];

//             Log.i(TAG, "absolutePath="+absolutePath);

pathArray.add(absolutePath);

}

}

Intent intent = new Intent();

intent.setClass(ImageGridView.this, ImageGalleryView.class);

intent.putExtra("path", path);

intent.putExtra("id", position);

intent.putExtra("data", (String[])pathArray.toArray(new String[pathArray.size()]));

Log.i("ImageGridView_setOnItemClickListener", "position="+position+"; path="+path);

ImageGridView.this.startActivity(intent);

}

});

}

/*

* 刷新Adapter

*/

private void addImage(LoadedImage... value) {

for (LoadedImage image : value) {

fileAdapter.addPhoto(image);

fileAdapter.notifyDataSetChanged();

}

}

private String[] getNames(int flag, String[] albums)

{

if(flag==0)

{

// Log.i(TAG, "----code comes to here----");

String[] paths=new String[albums.length];

String path=null;

String name=null;

for(int i=0; i

{

path=albums[i].split("&")[1];

name=path.substring(path.lastIndexOf("/")+1);

// Log.i(TAG, "path="+path+"; name="+name);

paths[i]=name;

}

return paths;

}

else if(flag==1)

{

String[] ids=new String[albums.length];

for(int i=0; i

{

// String id=albums[i].split("&")[0];

String id=albums[i].split("&")[1];

ids[i]=id;

}

return ids;

}

else

return albums;

}

/*

* 异步加载缩略图到LoadedImage然后调用addImage方法更新Adapter

*/

class AsyncLoadedImage extends AsyncTask {

@Override

protected Object doInBackground(Object... params) {

Bitmap bitmap;

Bitmap newBitmap;

for (int i = 0; i < paths.length; i++) {

try {

BitmapFactory.Options options = new BitmapFactory.Options();

options.inSampleSize = 10;

bitmap = BitmapFactory.decodeFile(paths[i], options);

newBitmap = ThumbnailUtils.extractThumbnail(bitmap, 80, 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 photos = new ArrayList();

public void addPhoto(LoadedImage photo) {

photos.add(photo);

}

public int getCount() {

return photos.size();

}

public FileAdapter(Context mContext) {

this.mContext = mContext;

}

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();

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值