linet

导航

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)    收藏  举报