用多了ListView之流 今天小朋友问这个问题时一时还无法回答全面 特此总结。
ListView多用于显示具有相同格式之数据,包含的数据类型也极为丰富,图片、声音、文本等等。。。
流程为,ListView找到使用的适配器,适配器在逐个实例化,实例化后显示,数据处理和Adapter处理比较关键。
就数据来说文本倒是好说,但是图片、声音在Android小小手机上缺是大问题,稍有不慎变会造成你OOM之类的错误,当然,笔者现在不会一般遇到类似问题。。。
1.首先,由于笔者经常接触图片处理,所以先说这点:
对于图片的处理,一定要注意图片的缓存和销毁,图片应该尽量压缩,一般流程为在缓存中寻找,找不到的开启多线程加载图片,
切记的是:一定要销毁图片占用的内存!!!
方法注意:图片的加载必须采用可为Android主线程接受的方式,如:
class PhotosLoader implements Runnable {
PhotoToLoad photoToLoad;
PhotosLoader(PhotoToLoad photoToLoad) {
this.photoToLoad = photoToLoad;
}
@Override
public void run() {
if (imageViewReused(photoToLoad))
return;
Bitmap bmp = getBitmap(photoToLoad.url);
memoryCache.put(photoToLoad.url, bmp);
if (imageViewReused(photoToLoad))
return;
BitmapDisplayer bd = new BitmapDisplayer(bmp, photoToLoad);
// 更新的操作放在UI线程中
Activity a = (Activity) photoToLoad.imageView.getContext();
a.runOnUiThread(bd);
}
}
public void run() {
if (imageViewReused(photoToLoad))
return;
if (bitmap != null)
photoToLoad.imageView.setImageBitmap(bitmap);
}
对于获取到的数据集中保存,集中销毁,线程保存最好采用单例模式,以便最后销毁。
另,对List数据采用静态存储都是作死的方法。。。应多检查逻辑
2.声音相对简单一点,只需要处理对应的读秒与更新,只需要注意销毁即可。
3.ListView 最好使用Android提供的若干方法,除了延迟加载的方法外 切勿在Adapter中进行其他数据获取操作,否则一来导致多次执行的问题,二来使程序无法控制ListView数据的显示时间,总而言之就是不建议的写法。。。
比较可取的办法是:在主Activity获取数据并传入适配器,适配器直接显示数据,可以实现较好的程序的高内聚,低耦合
4.图片压缩推荐项目:ImageMagic
图片延迟加载:universal-image-loader
建议查看谷歌源码关于ListView部分
忘记若干事情,想起来再写。。。