Android 开发笔记 ListView关于图片滚动速度与OOM处理相关建议
当ListView中显示图片,且列表很长,这时就要加载很多的图片数据,即Bitmap了。
如果在geiView时,每次都new一个Bitmap,由系统去回收不显示的图片数据。但是每次new就会导致滚动有点卡,因为new的时候应用需要把图片加载到内存中,需要花时间处理。
为了让ListView滚动更加流畅,需要把每次加载的图片数据Bitmap用数组或List存起来,重新显示图片时就可以直接得到数据,省去加载的时间。
1.对于ListView从Web获取数据的,第一次加载图片是比较慢的,保存了图片后,重新显示就迅速了。
2.对于本地数据,列表太长的话,总有第一次加载图片到内存中的问题,为了减少第一次滚动时也卡的问题,在Activity的onCreate中开一个线程进行图片数据的加载,这个线程加载图片不影响界面显示 ;
ListView设置适配器时也处理图片加载, 两者相互协调。
代码如下:
public class ListActivity extends Activity {
ListView imgList;
@Override
protected void onCreate(Bundle savedInstanceState) {
setContentView(R.layout.list);
super.onCreate(savedInstanceState);
txtList = (ListView) findViewById(R.id.list);
loadImg();
}
void loadImg() {
myImg = new Bitmap[myList.size()];
new Thread() {
public void run() {
try {
int size = myList.size();
for (int i = 0; i < size; i++) {
String path = ResourceTaker.IMAGE_PATH
+ myList.get(i).image.replace("/", "_");
if (myImg == null)
return;
Drawable dr = new WeakReference<Drawable>(
Drawable.createFromPath(path)).get();
myImg[i] = new WeakReference<Bitmap>(
((BitmapDrawable) dr).getBitmap()).get();
}
} catch (OutOfMemoryError e) {
System.gc();
e.printStackTrace();
} catch (NullPointerException e) {
e.printStackTrace();
}
}
}.start();
}
因为加载了太多的图片数据,当点击ListView项进入详细页面时,详细页面通常要现实更大的图片。就容易导致内存溢出。
可以的办法就是在进入详细面时,回收ListView页面的图片数据,在回到ListView页面时,再加载图片数据。
回收图片可以直接把数组或List保存的Bitmap对象设为null,即==null;
可以的话,先让对象recycle 一下,在==null,但是重新回到ListView页面时没有从新设置ListView的适配器的话,会导致出错,提示recycle的图片不可以再用了。
如果进行recycle的话,要进行重设适配器,
重新回到ListView页面重新加载图片与处理ListView过程要放在onResume函数中。
void clearImage() {
if (myList != null) {
for (ArticleResponse app : myList) {
// if (app.bitmap != null && !app.bitmap.isRecycled()) {
// app.bitmap.recycle();
// }
app.bitmap = null;
app.flag = false;
}
}
}
@Override
protected void onResume() {
super.onResume();
if (myList != null && adapter != null) {
adapter.notifyDataSetChanged();
}
}
posted on 2012-08-17 15:47 linvaluable 阅读(1015) 评论(0) 收藏 举报
浙公网安备 33010602011771号