文档章节

android 异步加载图片缩略图

dianliang
 dianliang
发布于 2017/04/12 14:12
字数 562
阅读 37
收藏 0

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/861587/blog/87582

dianliang
粉丝 0
博文 4
码字总数 487
作品 0
海淀
私信 提问
进一步优化Android ListView GridView中异步加载图片

最近在对编写完后的FileManager做优化,发觉其中异步加载图片的那块代码还需要在重构一下。 首先我先说明一下,该FileManager中显示文件图标的控件为GridView,并且最大可视区域为20个图标,...

龙虾达人
2012/07/01
7K
5
收藏的Android非常好用的组件或者框架。

收藏的Android非常好用的组件或者框架。 android框架 先说两个网站: http://www.androidviews.net/ http://www.23code.com http://www.theultimateandroidlibrary.com/ 1. https://github.c......

23Code.com
2013/11/07
595
6
软件测试工程师求职

张密 简历 18621641882 姓 名: 张密 性别: 女 工作经验: 一年 出生年月: 1987-10 手机: 18621641882 政治面貌: 党员 学 历: 本科 专业: 计算机科学与技术 籍 贯: 湖北 现居住地: ...

张密
2012/06/28
495
8
Glide图片加载

在build.gradle中添加依赖: 需要support-v4库的支持,如果你的项目没有support-v4库(项目默认已经添加了),还需要添加support-v4依赖: 混淆规则:其中第一个混淆规则表明不混淆所有的Glide...

大漠孤烟直_v
2018/01/02
0
0
关于MediaStore Thumbnails的问题:数据库中有记录,但实际路径下没有文件

我的测试用机是Android 4.1.2 在数据库中查询到 有一堆缩略图 但是实际对应路径下一个文件都没有。难道是数据库没有刷新?我调用了MediaScanner重新扫描,还是没用,重启手机,数据库依然没有...

fishwjy
2014/10/16
474
1

没有更多内容

加载失败,请刷新页面

加载更多

用 4G 工作是什么体验

七月开始,因为工作原因,在公司附近租了个住处,方便工作。离公司近了,感觉就是不一样,之前每天 5:30 就要起床赶地铁,现在可以睡到自然醒,一看才 7 点,悠闲的起床洗漱,踱步到公司,都...

zzxworld
15分钟前
4
0
sonar报错volatile

问题发生 原先代码如下: //认证授权码private static volatile String AUTHORIZATION_CODE = "init"; git push 之后,sonar认为这是个bug检测报告截图如下: 分析排查 解释说明: Markin...

开源小菜鸟2333
19分钟前
2
0
《Java实践指南》--读后

闲读《Java实践指南》... 1.lvy 某些项目中能够看到ivy.xml。早期使用ant的项目中,常常用ivy.xml来下载项目依赖。 2.ant 作为java程序员,应该都知道ant,虽然可能用过的人不多。为什么ant...

RippleChan
21分钟前
2
0
前端:固定表格(table)表头的实现方式

在写插件 bootstrap table 的时候,当数据过多的时候,需要对表格的 thead 进行固定,然后滚动表格的 tbody 。但是在实际的操作上,花了很多的时间在这个问题上,到现在也没有找到完美的解决...

前端老手
22分钟前
5
0
第五章 spring-connet之AnnotationConfigUtils

前言 AnnotatedBeanDefinitionReader是AnnctionConfig相关上下文与AnnotationConfigUtils的桥梁。还有一个作用是解析class成为BeanDefinitionHolder,注册到容器里面。AnnotationConfigUtils...

鸟菜啊
昨天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部