【发布时间】:2015-10-12 01:53:54
【问题描述】:
我有一个列表视图,它显示带有缩略图的视频,我正在使用光标适配器(使用 ContentProvider 获取)。问题是随着列表项数量的增加,列表视图性能变得非常差。请告诉我使其延迟加载的最佳方法。
新: 我终于找到了一些解决方案。它对我来说工作正常。如果您有任何建议,请告诉我。 我的新代码在这里。 (它使用堆栈与生产者消费者模式和免费线程进行处理)
@覆盖 public void bindView(View view, Context context, Cursor cursor) {
ViewHolder holder = (ViewHolder) view.getTag();
String name = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Video.Media.TITLE));
int id = cursor.getInt(cursor.getColumnIndexOrThrow(MediaStore.Video.Media._ID));
holder.getIdView().setText(name);
holder.getThumbView().setTag((Integer)id);
if(LazyLoader.getInstance().containsKey(id)) {
Object bitmap = LazyLoader.getInstance().getBitMap(id);
if(null != bitmap && (bitmap instanceof Bitmap)) {
holder.getThumbView().setImageBitmap((Bitmap)bitmap);
} else {
holder.getThumbView().setImageDrawable(null);
}
} else {
holder.getThumbView().setImageDrawable(null);
LazyItem lazyItem = new LazyItem();
lazyItem.setId(id);
lazyItem.setThumbNail(holder.getThumbView());
LazyLoader.getInstance().putItem(lazyItem);
}
}
public class LazyLoaderHelper extends Thread {
private ContentResolver resolver = null;
private Activity activity;
private boolean isActive = true;
ExecutorService executor;
public LazyLoaderHelper(Activity _activity , ContentResolver _resolver) {
resolver = _resolver;
activity = _activity;
isActive = true;
executor = Executors.newFixedThreadPool(10);
}
public void stopThread() {
isActive = false;
executor.shutdown();
}
@Override
public void run() {
while (isActive) {
if(LazyLoader.getInstance().getSize() > 0) {
final LazyItem lazyItem = LazyLoader.getInstance().getItem();
if(null != lazyItem) {
executor.execute(new Runnable() {
@Override
public void run() {
BitmapFactory.Options options = new BitmapFactory.Options();
options.inSampleSize = 1;
if ((null != resolver) && (null != activity)) {
final Bitmap thumb = MediaStore.Video.Thumbnails.getThumbnail(resolver, lazyItem.getId(), MediaStore.Video.Thumbnails.MICRO_KIND, options);
if (null != thumb) {
LazyLoader.getInstance().putBitMap(lazyItem.getId(), thumb);
} else {
LazyLoader.getInstance().putBitMap(lazyItem.getId(), new Object());
}
if ((Integer) lazyItem.getThumbNail().getTag() == lazyItem.getId()) {
activity.runOnUiThread(new Runnable() {
@Override
public void run() {
if (null != thumb) {
lazyItem.getThumbNail().setImageBitmap(thumb);
} else {
lazyItem.getThumbNail().setImageDrawable(null);
}
}
});
}
}
}
});
}
}
}
}
}
【问题讨论】:
-
图片延迟加载我推荐UIL。
-
发布您的适配器代码
-
你使用 ViewBinder 吗?如果是这样,也发布它的代码
标签: android