android 异步加载图片缩略图

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

转载于:https://my.oschina.net/u/3204932/blog/877545

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值