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

android 异步加载图片缩略图

2017-04-12 00:00 260 查看
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<String> pathArray=new ArrayList<String>();
for(int i=0; i<albums.length; 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<albums.length; 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<albums.length; 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<Object, LoadedImage, Object> {
@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<LoadedImage> photos = new ArrayList<LoadedImage>();

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();
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: