我仍在使用流畅的回收器视图来加载图像,而不会过多地阻塞ui线程。
问题在于单词“回收”本身。 在我的应用程序中,我有一长串包含mp3文件的列表,这些文件的名称,歌手和专辑封面都不同。
但是,它们都使用相同的布局。
但是我现在可以回收视图了吗?
由于正确加载相册封面(也可以裁剪)占用了最多资源,因此我决定不回收带有相册封面的视图,而仅回收那些没有相册封面的视图,就像这样:
private async Task SetContentAsync(PhotoViewHolder vh, int position)
{
string SongName = "";
string ArtistName = "";
Bitmap bitmap = null;
byte[] data = null;
try
{
reader.SetDataSource(mp3Obj[position].Mp3Uri);
}
catch { }
await Task.Run(() => // cause problems with the reload
{
SongName = reader.ExtractMetadata(MediaMetadataRetriever.MetadataKeyTitle);
ArtistName = reader.ExtractMetadata(MediaMetadataRetriever.MetadataKeyArtist);
data = reader.GetEmbeddedPicture();
if (data != null)
{
try
{
bitmap = BitmapFactory.DecodeByteArray(data, 0, data.Length);
}
catch { }
}
});
((Activity)ctx).RunOnUiThread(() =>
{
vh.SongName.SetTypeface(tf, TypefaceStyle.Normal);
vh.AristName.SetTypeface(tf, TypefaceStyle.Normal);
vh.SongName.Text = SongName;
vh.AristName.Text = ArtistName;
try
{
if (bitmap != null)
{
vh.IsRecyclable = false; // MOST IMPORTANT THING TO DO!
ConvertBitmapToBackground(bitmap, vh, false); // Set As Backgorund, blurry and black ( just sets the variable)
CutImageIntoForm(bitmap, vh); // Set as the musical note button
}
else // because recycler items inherit their shit and if it is altered it just shows views were there shouldnt be any ...
{
vh.IsRecyclable = true;
// vh.CoverArt.SetImageResource(Resource.Drawable.btn_musicalnote);
// ConvertBitmapToBackground(bitmap, vh, true); // Set As Backgorund, blurry and black ( just sets the variable)
}
}
catch { }
});
}
请注意,根据是否有专辑封面,我怎么说“ vh.IsRecyclable = ...”?
这是滞后最少的解决方案,并且只有很少的视图包含专辑封面时才有效。但是,当用户所有歌曲都带有专辑封面时,回收站视图将变得非常慢。
我遇到的另一个问题是,有时在出现滞后时,视图会翻倍甚至三倍。仍然指向正确的文件,但是它们都具有相同的歌曲名称。
那么什么是最佳实践? 什么时候可以回收视图,什么时候不可以? 如何加快回收站视图?
非常感谢您的回答!