我正在使用 Xamarin 开发跨平台应用程序。我找到了 Akavache,但我无法在 listview 适配器中使用 Akavache 处理图像加载。它的工作速度非常慢。所以我需要修复它或找到另一种方法来处理这个问题。我也找不到一个好的例子或样本。
我正在尝试使用 getView 方法在 Listview 适配器中下载和加载图像,如下所示:
public override View GetView(int position, View convertView, ViewGroup parent)
{
var view = convertView;
ViewHolder holder = null;
if (view != null) // otherwise create a new one
holder = view.Tag as ViewHolder;
if (holder == null)
{
holder = new ViewHolder();
view = _activity.LayoutInflater.Inflate(Resource.Layout.Book_Item, null);
holder.TextItem1 = view.FindViewById<TextView>(Resource.Id.TextItem1);
holder.TextItem2 = view.FindViewById<TextView>(Resource.Id.TextItem2);
holder.ImageView = view.FindViewById<ImageView>(Resource.Id.BookImage);
getImage(position, holder.ImageView, image => holder.ImageView.SetImageDrawable(image.ToNative()));
}
holder.TextItem1.Text = _list[position].volumeInfo.title;
holder.TextItem2.Text = _list[position].volumeInfo.publishedDate;
return view;
}
public async void getImage(int position, ImageView imageView, Action <IBitmap> setImage)
{
var image = await _cache.GetAnImage(_list[position].volumeInfo.imageLinks.smallThumbnail);
setImage(image);
}
在我的 DataCache 类中,我尝试通过以下方式获取图像,滚动时 loadImageFromUrl 无法按预期工作,重新加载图像需要很长时间。GetAndFetchLatest 和 GetOrFetchObject 方法给出 InvalidCastException。异常消息在最后。你有任何类似的例子或任何建议来解决我的问题吗?
public async Task<IBitmap> GetAnImage(string imageUrl)
{
// return await BlobCache.InMemory.GetAndFetchLatest( imageUrl, async() => await DownloadImage(imageUrl), offset => true);
// return await BlobCache.InMemory.GetOrFetchObject(imageUrl, async () => await DownloadImage(imageUrl));
return await DownloadImage(imageUrl);
}
public async Task<IBitmap> DownloadImage(string imageUrl)
{
return await BlobCache.InMemory.LoadImageFromUrl(imageUrl, true, 100, 100);
}
未处理的异常:12-11 12:48:54.560 I/MonoDroid(2017):System.InvalidCastException:无法从源类型转换为目标类型。12-11 12:48:54.560 I/MonoDroid(2017):在(包装器 castclass)对象:__castclass_with_cache(对象,intptr,intptr) 12-11 12:48:54.564 I/MonoDroid(2017):在 Akavache.JsonSerializationMixin+ c__AnonStorey1
1[System.Byte[]].<>m__0 (System.Exception _) [0x00000] in <filename unknown>:0 12-11 12:48:54.564 I/MonoDroid( 2017): at System.Reactive.Linq.ObservableImpl.Catch
2+_[System.Byte[],System.Exception].OnError (System.Exception 错误) [0x00000] in :0 12-11 12:48:54.572 I/MonoDroid(2017): --- 堆栈跟踪结束从先前引发异常的位置 --- 12-11 12:48:54.572 I/MonoDroid(2017): at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw () [0x00000] in :0 12-11 12:48: 54.580 I/MonoDroid(2017):在 System.Reactive.PlatformServices.ExceptionServicesImpl.Rethrow(System.Exception 异常)[0x00000] 在:0 12-11 12:48:54.580 I/MonoDroid(2017):在 System.Reactive。 ExceptionHelpers.ThrowIfNotNull(System.Exception 异常)[0x00000] 在:0 12-11 12:48:54.580 I/MonoDroid(2017):在 System.Reactive.Subjects.AsyncSubject`1[Splat.IBitmap].GetResult () [ 0x00000] in :0 发生未处理的异常。
更新:保罗回答了我,所以现在我知道我不能将 GetOrFetchObject 与 IBitmaps 一起使用,因为它们是 UI 元素。所以现在不需要异常消息。但是 loadImageFromUrl 方法在滚动时会阻塞我的 UI 线程。所以这对我来说仍然是一个大问题。