Android ListView加载图片很卡的问题,希望大神有办法帮我解决一下。

梅明子 2015-04-07 11:33:12
这是一个加载音乐图片的问题
下面是一个 adapter 的 getView 方法,在该方法中最后面 setImageBitmap 就是这里设置图片会导致listView滑动很卡。


@Override
public View getView(final int position, View view, ViewGroup parent) {
ViewHolder holder;
if (view == null) {
view = inflater.inflate(R.layout.list_view_music_item, null);
holder = new ViewHolder();
holder.tvMusicTitle = (TextView) view.findViewById(R.id.itemName);
holder.tvMusicDes = (TextView) view.findViewById(R.id.itemDetail);
holder.albumPic = (ImageView) view.findViewById(R.id.listView_albumPic);
holder.frm_menu_layout = (RelativeLayout) view.findViewById(R.id.frm_menu);
view.setTag(holder);
} else {
holder = (ViewHolder) view.getTag();
}
holder.frm_menu_layout.setOnClickListener(new MenuOnClickListener(position));
if (MyApplication.getCurrentMusic() != null &&
musics.get(position).getId() == MyApplication.getSharedPreferences()) {
view.setBackgroundResource(R.drawable.item_background);
} else {
view.setBackgroundColor(Color.WHITE);
}
holder.tvMusicTitle.setText(musics.get(position).getTitle());
holder.tvMusicDes.setText(musics.get(position).getArtist() + " - "
+ musics.get(position).getAlbum());
// 更新专辑图片
holder.albumPic.setTag(musics.get(position).getData());
holder.albumPic.setImageBitmap(ImageManager.loadMusicImage(activity,musics.get(position)));
return view;
}


然后我把 ImageManager 这个类贴出来,加载图片和默认图片的

/**
* 加载图片管理类
* @author Administrator
*
*/
public class ImageManager {
private static final Uri sArtworkUri = Uri.parse("content://media/external/audio/albumart");

public static Bitmap loadMusicImage(Context context, Music music) {
if(music == null){
//加载默认图片
return ImageUtil.readResourcesBitmap(context, R.drawable.default_album_identify);
}
return loadMusicImage(context, music, R.drawable.default_album_identify);
}

public static Bitmap loadMusicImage(Context context, Music music, int defaultImage) {
Bitmap bm = getArtwork(context, music.getId(), music.getAlbumId());
if (bm == null && defaultImage!=0) {
bm = ImageUtil.readResourcesBitmap(context, defaultImage);
}
return bm;
}

public static Bitmap getArtwork(Context context, long song_id, long album_id) {
if (album_id < 0) {
if (song_id >= 0) {
Bitmap bm = getArtworkFromFile(context, song_id, -1);
if (bm != null) {
return bm;
}
}
return null;
}
ContentResolver res = context.getContentResolver();
Uri uri = ContentUris.withAppendedId(sArtworkUri, album_id);
if (uri != null) {
InputStream in = null;
try {
in = res.openInputStream(uri);
BitmapFactory.Options opt = new BitmapFactory.Options();
opt.inPreferredConfig = Bitmap.Config.RGB_565;
opt.inPurgeable = true;
opt.inInputShareable = true;
return BitmapFactory.decodeStream(in, null, opt);
} catch (FileNotFoundException ex) {
Bitmap bm = getArtworkFromFile(context, song_id, album_id);
if (bm != null) {
if (bm.getConfig() == null) {
bm = bm.copy(Bitmap.Config.RGB_565, false);
}
}
return bm;
} finally {
try {
if (in != null) {
in.close();
}
} catch (IOException ex) {
}
}
}
return null;
}

private static Bitmap getArtworkFromFile(Context context, long songid,long albumid) {
Bitmap bm = null;
if (albumid < 0 && songid < 0) {
throw new IllegalArgumentException("Must specify an album or a song id");
}
try {
BitmapFactory.Options opt = new BitmapFactory.Options();
opt.inPreferredConfig = Bitmap.Config.RGB_565;
opt.inPurgeable = true;
opt.inInputShareable = true;
if (albumid < 0) {
Uri uri = Uri.parse("content://media/external/audio/media/"+ songid + "/albumart");
ParcelFileDescriptor pfd = context.getContentResolver().openFileDescriptor(uri, "r");
if (pfd != null) {
FileDescriptor fd = pfd.getFileDescriptor();
bm = BitmapFactory.decodeFileDescriptor(fd, null, opt);
}
} else {
Uri uri = ContentUris.withAppendedId(sArtworkUri, albumid);
ParcelFileDescriptor pfd = context.getContentResolver().openFileDescriptor(uri, "r");
if (pfd != null) {
FileDescriptor fd = pfd.getFileDescriptor();
bm = BitmapFactory.decodeFileDescriptor(fd, null, opt);
}
}
} catch (FileNotFoundException ex) {

}
return bm;
}
}
...全文
254 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
梅明子 2015-04-08
  • 打赏
  • 举报
回复
引用 2 楼 yexianghu 的回复:
不要在UI线程中加载图片,异步加载好后直接设置到imageview中 可以使用Android-Universal-Image-Loader https://github.com/nostra13/Android-Universal-Image-Loader
谢谢,问题已解决了!
只为搞笑 2015-04-07
  • 打赏
  • 举报
回复
用异步加载或者第三方的吧,搜一下imageloader,很多
yexianghu 2015-04-07
  • 打赏
  • 举报
回复
不要在UI线程中加载图片,异步加载好后直接设置到imageview中 可以使用Android-Universal-Image-Loader https://github.com/nostra13/Android-Universal-Image-Loader

80,351

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧