在getView中加载缩略图,按照顺序一张一张的显示
前提:使用的是HTTP请求,访问的是一个DVR中的文件(图片),这里的DVR猜测不支持并发,不是访问HTTP的服务器。
过程:
1、使用之前的图片加载工具ImageLoader
出现问题:仅能加载出第一张图片后面的图片均为默认图片方式显示。
——————————————————————————————————————————————————————————————————————
2、在getView中开启子线程去访问远端获取数据:
new Thread(){// OK
public void run(){
try{
Thread.sleep((position + 1) * 1000);
//Thread.sleep(1000);
IMGView imgViewInstance = new IMGView();
imgViewInstance.mUrl = pictureUrl;
imgViewInstance.imageBtn = imageBtn;
Message msg = mHandler1.obtainMessage();
msg.obj = imgViewInstance;
mHandler1.sendMessage(msg);
//imageLoader.getIMGOfThumb(pictureUrl, imageBtn);
} catch (InterruptedException e){
}
}
}.start();
其中的mHandler1:
public Handler mHandler1 = new Handler(){
@Override
public void handleMessage(Message msg) {
Message message = msg;
IMGView imgBeanHolder = (IMGView) message.obj;
ImageView imageBtn = imgBeanHolder.imageBtn;
String pictureUrl = imgBeanHolder.mUrl;
imageLoader.getIMGOfThumb(pictureUrl, imageBtn);
//imageLoader.loadImage(pictureUrl, imageBtn, true);
super.handleMessage(msg);
}
};
方法getIMGOfThumb()做同步处理:
public synchronized void getIMGOfThumb( String picUrl, final ImageView imageBtn) {//synchronized
}
通过getView的参数position,使用延时处理,完成,存在的问题,当数据量很大的时候,用户向下滑动,要等待很久图片才会被加载显示出来。可取,需优化。
————————————————————————————————————————————————————————————————
3、使用线程池,带有顺序执行的
在getView中执行
executorService.execute(new ObtainPictureFromDevice(imageLoader,
imgViewInstance));
全局变量
private ExecutorService executorService = Executors.newSingleThreadExecutor();
private class ObtainPictureFromDevice implements Runnable{
private ImageLoader imageLoader = null;
private IMGView imgBeanHolder = null;
public ObtainPictureFromDevice(ImageLoader imageLoader, IMGView imgBeanHolder){
this.imageLoader = imageLoader;
this.imgBeanHolder = imgBeanHolder;
}
@Override
public void run() {
ImageView imageBtn = imgBeanHolder.imageBtn;
String pictureUrl = imgBeanHolder.mUrl;
imageLoader.getIMGOfThumb(pictureUrl, imageBtn);// 同步的是imageloader的对象
}
}
结果验证:不可取
—————————————————————————————————————————————————————————————————
4、依旧在getView中开启线程访问,通过广播方式,知晓当前ListView的显示条目的位置,随后再做图片的加载显示。
new Thread(new Runnable() {
@Override
public void run() {
String url = "http://"+Application.DVR_IP +"/thumb/Photo/" + fileName_short;
netImage.getImageSyn(url, context, map.mName, item.thumbBtn, false);
}
}).start();
*************************************
public synchronized void getImageSyn( String picUrl, final Context context,
final String keyName, final ImageView imageBtn, final boolean isSave) {
……
InputStream inputStream = urlConnection.getInputStream() ;
try {
Bitmap bmp = BitmapFactory.decodeStream(inputStream);
if(bmp!=null) {
//imageBtn.setImageBitmap(bmp);
ThumbnailCache.getInstance().addThumbToCache(keyName, bmp);
UtilAssist.Util_SendBroadCast(MessageName.BROADCAST_DVR_Thumb,keyName);
}
} finally {
inputStream.close() ;
}
}
************************************************
最后接收广播计算显示的图片位置,此处代码略。
验证可取。
_____________________________________________________________________________