安卓学习历程-第三天

来源:互联网 发布:香港崇光sogo mac 编辑:程序博客网 时间:2024/06/11 00:53

参照网上代码,使用AsyncTask和Adapter实现图片异步加载

         继承BaseAdapter类自定义Adapter类

         使用mLayoutInFlater实现动态加载布局

         使用getTag()与setTag()优化Item的加载

    private Context mContext;    private LayoutInflater mLayoutInFlater=null;    private List<String> mList=null;    private int width=120;    private int height=150;    public static class MyGridViewHolder{        public ImageView imageview_thumbnail;        public TextView textview_test;    }    public MyGridViewAdapter(Context context,List<String> list){        this.mContext=context;        this.mList=list;        mLayoutInFlater= LayoutInflater.from(context);    }    @Override    public int getCount(){        return mList.size();    }    @Override    public Object getItem(int arg0){        return null;    }    @Override    public long getItemId(int position){        return 0;    }    @Override    public View getView(int position, View convertView, ViewGroup parent) {        MyGridViewHolder viewHolder = null;        if (convertView == null) {            viewHolder = new MyGridViewHolder();            convertView = mLayoutInFlater.inflate(R.layout.layout_my_gridview_item, null);            viewHolder.imageview_thumbnail = (ImageView) convertView.findViewById(R.id.imageview_thumbnail);            viewHolder.textview_test = (TextView) convertView.findViewById(R.id.textview_test);            convertView.setTag(viewHolder);        } else            viewHolder = (MyGridViewHolder) convertView.getTag();        String url=mList.get(position);        //需要加载的图片已经在加载,不用添加线程加载        //如果不是加载需要的图片,取消线程,创建线程加载需要的图片        if(cancelPotentialLoad(url,viewHolder.imageview_thumbnail)){            AsyncLoadImageTask task=new AsyncLoadImageTask(viewHolder.imageview_thumbnail);  //创建线程 加载图片            LoadedDrawable loadedDrawable=new LoadedDrawable(task);                            //记录加载任务            viewHolder.imageview_thumbnail.setImageDrawable(loadedDrawable);                 //设置图片            task.execute(position);        }        viewHolder.textview_test.setText((position+1)+"");                                    //设置文本        return convertView;    }

         使用AsyncTask异步加载图片,并自定义函数检测,防止多个线程同时加载图片

private class AsyncLoadImageTask extends AsyncTask<Integer,Void,Bitmap> {        private String url=null;        private final WeakReference<ImageView> imageViewWeakReference;        public AsyncLoadImageTask(ImageView imageview){            super();            imageViewWeakReference=new WeakReference<ImageView>(imageview);        }        protected Bitmap doInBackground(Integer... params){  //将图片和地址存入map            Bitmap bitmap=null;            this.url=mList.get(params[0]);            bitmap=getBitmapFromUrl(url);                     //获取图片            MainActivity.gridviewBitmapCaches.put(mList.get(params[0]),bitmap);            return bitmap;        }        protected void onPostExecute(Bitmap resultBitmap){  //将图片放入imageview??            if(isCancelled()){                resultBitmap=null;            }            if(imageViewWeakReference!=null){                ImageView imageView=imageViewWeakReference.get();                AsyncLoadImageTask loadImageTask=getAsyncLoadImageTask(imageView);                if(this==loadImageTask){                    imageView.setImageBitmap(resultBitmap);                    imageView.setScaleType(ImageView.ScaleType.CENTER_INSIDE);                }            }            super.onPostExecute(resultBitmap);        }    }

         定义函数压缩图片,节约内存

        

public static Bitmap getBitmapThumbnail(String path, int width, int height) {        Bitmap bitmap = null;        BitmapFactory.Options opts = new BitmapFactory.Options();        opts.inJustDecodeBounds = true;        BitmapFactory.decodeFile(path, opts);        opts.inSampleSize = Math.max((int) (opts.outHeight / (float) height), (int) (opts.outWidth / (float) width));        opts.inJustDecodeBounds = false;        bitmap = BitmapFactory.decodeFile(path, opts);        return bitmap;    }    public static Bitmap getBitmapThumbnail(Bitmap bmp,int width,int height){        Bitmap bitmap=null;        if(bmp!=null){            int bmpWidth=bmp.getWidth();            int bmpHeight=bmp.getHeight();            if(width!=0&&height!=0){                Matrix matrix=new Matrix();                float scaleWidth=((float)width/bmpWidth);                float scaleHeight=((float)height/bmpHeight);                matrix.postScale(scaleWidth,scaleHeight);                bitmap=Bitmap.createBitmap(bmp,0,0,bmpWidth,bmpHeight,matrix,true);            }            else{                bitmap=bmp;            }        }        return bitmap;    }


         文章摘自:

         http://blog.csdn.net/jia516967927/article/details/50730502

原创粉丝点击