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 ;
}
}
}
现在我明白了 做东西加缓存,还有异步实现对程序的重要性。