android 異步加載圖片縮略圖

package com.worldchip.apk; import java.io.File; import java.util.ArrayList; import java.util.LinkedList; import android.app.Activity; import android.content.Context; import android.content.Intent; import android.database.Cursor; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.drawable.Drawable; import android.media.ThumbnailUtils; import android.os.AsyncTask; import android.os.Bundle; import android.os.Environment; import android.provider.MediaStore.Images.Thumbnails; import android.util.Log; import android.view.View; import android.view.ViewGroup; import android.view.Window; import android.view.animation.Animation; import android.view.animation.TranslateAnimation; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.BaseAdapter; import android.widget.GridView; import android.widget.ImageView; import android.widget.Toast; 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();     } }
相關文章
相關標籤/搜索