ListView,实现滚动分页效果。实现异步加载URL生成的图片。使得屏幕不卡

我们开发一个项目的时候,从网上得到的图片然后生成Bitmap 这过程非常耗时。在滑动的过程中会非常的卡。严重的影响了用户体验。

ListView  分页的文章网上一搜一大把。现在看一下怎样实现异步加载

public class AsyncImageLoader {
    //图片缓存器
    private Map<String, SoftReference<Bitmap>> imageCache=new HashMap<String, SoftReference<Bitmap>>();
    
    public Bitmap loadDrawable(final String imageUrl,final ImageCallback callback){
        //如果传过来的图片已经生成了图片对象
        if(imageCache.containsKey(imageUrl)){
            SoftReference<Bitmap> softReference=imageCache.get(imageUrl);
            if(softReference.get()!=null){
                return softReference.get();
            }
        }
        //生成一handler对象用来接收消息
        final Handler handler=new Handler(){
            @Override
            public void handleMessage(Message msg) {
                callback.imageLoaded((Bitmap) msg.obj, imageUrl);
            }
        };
        //在一个新的线程中加载
        new Thread(){
            public void run() {
                Bitmap bitmap=getBitMap(imageUrl);;
//                Drawable drawable=loadImageFromUrl(imageUrl);
                imageCache.put(imageUrl, new SoftReference<Bitmap>(bitmap));
                handler.sendMessage(handler.obtainMessage(0,bitmap));
            };
        }.start();
        return null;
    }
    
 
    //回调函数
    public interface ImageCallback{
        public void imageLoaded(Bitmap imageDrawable,String imageUrl);
    }
    //通过url返回一个图片
    public Bitmap getBitMap(String url){
         Bitmap bitmap =ViewWeb.vieweb.getHttpBitmap(url);                
         Bitmap newBit=BitmapFactory.decodeResource(ViewWeb.vieweb.getResources(),R.drawable.test);

     if(bitmap!=null){
         newBit=ViewWeb.vieweb.getScaleImg(bitmap,80,80);
     }
     return newBit;
    }
}

在listViewAdapter中这样写

    class listViewAdapter extends BaseAdapter {
        //一个listView显示的数据数
        int count =10; /* starting amount */
        //异步加载图片的线程
        private AsyncImageLoader imageLoader = new AsyncImageLoader();
        @Override
        public int getCount() {
            return count;
        }
        @Override
        public Object getItem(int pos) {
            return pos;
        }
        @Override
        public long getItemId(int pos) {
            return pos;
        }
        //当前的缓存
        private Map<Integer, View> viewMap = new HashMap<Integer, View>();
        @Override
        public View getView(int pos, View v, ViewGroup group) {
            //缓存器
            View rowView =viewMap.get(pos);
            
            //如果当前没有内容
            if(rowView==null){

                TableLayout table=new TableLayout(ViewWeb.this);    
             TableRow layout=new TableRow(ViewWeb.this);
             layout.setOrientation(LinearLayout.HORIZONTAL);

             try{
            page=allPageData[pos];

             }catch(Exception e){
                 Toast.makeText(getApplicationContext(),"已到结尾", Toast.LENGTH_SHORT).show();
             }
             if(pos>allPageData.length-1){
                 pos=allPageData.length-1;
                
             }
             //右边的整体布局
             View right = LayoutInflater.inflate(R.layout.right, null);
               right.setPadding(20, 10, 10, 10);
//             final ImageView imageView=(ImageView)right.findViewById(R.id.synjd);
               //图片显示单开一个线程
               final ImageView imageView=new ImageView(ViewWeb.this);
               imageView.setBackgroundResource(R.drawable.wait);
              
             imageLoader.loadDrawable(page.getImg(), new ImageCallback() {

                    public void imageLoaded(Bitmap imageDrawable, String imageUrl) {
                        imageView.setBackgroundResource(0);
                        imageView.setImageBitmap(imageDrawable);
                        imageView.setPadding(10, 10, 10, 10);
                        
                    }
                });
             
        

             
               //得到标题
               TextView title=(TextView)right.findViewById(R.id.firstTitle);
               title.setText(page.getTitle());
               //得到环境
               TextView hj=(TextView)right.findViewById(R.id.huangjingid);
               hj.setText(page.getHj());
               //服务
               TextView fw=(TextView)right.findViewById(R.id.fuwuid);
               fw.setText(page.getFw());
               //口味
               TextView kw=(TextView)right.findViewById(R.id.kouweiid);
               kw.setText(page.getKw());
               //价格
               TextView jg=(TextView)right.findViewById(R.id.jiageid);
               jg.setText(page.getJg());
               //综合得分
               
               TextView zhdf=(TextView)right.findViewById(R.id.zhdfid);
               String df=page.getZhdf();
               zhdf.setText(df);
               double score=Double.parseDouble(df);
               //判断有几颗完全的星
               int fullStar=(int)score/1;
               //判断是否有半个的星
               boolean hasHarf=false;
               if(score%1!=0){
                   hasHarf=true;
               }
               
               //7个ImageView的
               int []imageIndex={R.id.image0,R.id.image1,R.id.image2,R.id.image3,R.id.image4,R.id.image5,R.id.image6,R.id.image7};
             //放星的那八个ImageView
               ImageView imageViews[]=new ImageView[imageIndex.length];
               for(int i=0;i<imageViews.length;i++){
                   
                   imageViews[i]=(ImageView)right.findViewById(imageIndex[i]);
                   if(i<=fullStar-1){
                       imageViews[i].setBackgroundResource(R.drawable.star);
                   }else if(hasHarf && i==fullStar){
                       imageViews[i].setBackgroundResource(R.drawable.harfstar);
                   }else{
                       imageViews[i].setBackgroundResource(R.drawable.nostar);
                   }
               }
               //画出一行
               layout.addView(imageView, rowP);
               layout.addView(right, rowP);
               //画出整个表格
               table.addView(layout,tableP);
              
//              final String url= harfUrl+"id="+page.getSid()+"&mobile=ok&output=xml";
               //把当前的位置传过去
              final String index=String.valueOf(pos);
               layout.setOnClickListener(new OnClickListener(){

                    @Override
                    public void onClick(View v) {
                        //传到详细信息的页面
                        Intent intent = new Intent(ViewWeb.this,ViewWebDetail.class);
                        intent.putExtra("index",index);
                        startActivity(intent);
                        
                    }
                      
                  });
               //把位置和view都放到缓存里
               viewMap.put(pos, table);
               return table;

            }else{
                //如果有的话就直接返回缓存里的
            return rowView ;
            }
        }
    }

现在我明白了 做东西加缓存,还有异步实现对程序的重要性。

posted on 2011-07-19 17:50  一叶飘舟  阅读(1243)  评论(0编辑  收藏  举报