Отображение изображений в виде списка с помощью адаптера Akavache
Я занимаюсь разработкой кроссплатформенного приложения с использованием Xamarin. Я нашел Akavache, но не смог обработать загрузку изображений с помощью Akavache в адаптере списка. Это работает очень медленно. Поэтому мне нужно исправить это или найти другой способ справиться с этим. Я не смог найти ни хорошего примера, ни образца.
Я пытаюсь загрузить и загрузить изображение в ListView Adapter в методе getView следующим образом:
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): объект at (класс-оболочка):__castclass_with_cache (object,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] в:0 12-11 12:48:54.572 I/MonoDroid( 2017): --- Трассировка конца стека из предыдущего места, где было сгенерировано исключение --- 12-11 12:48:54.572 I/MonoDroid( 2017): в System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw () [0x00000] в: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, потому что они являются элементами пользовательского интерфейса. Так что сообщение об исключении теперь не нужно. Но метод loadImageFromUrl блокирует мой поток пользовательского интерфейса при прокрутке. Так что все же это большая проблема для меня.
1 ответ
Наконец я решил проблему. Прежде всего, я понял, что это не проблема Akavache, попробовав другую библиотеку (MonoDroid.UrlImageViewHelper). Затем я подумал, что проблема может быть связана с самим списком. Я старший разработчик, поэтому я знаю оптимизацию списков, но все же я ищу новую тактику оптимизации, чтобы увидеть, что я что-то пропустил.
Прежде всего, я рекомендую вам взглянуть на этот сайт: http://leftshift.io/6-ways-to-make-your-lists-scroll-faster-than-the-wind
Я уже знаю многие из этих предложений, но реальная разница заключается в изменении высоты списка для соответствия родительскому элементу и содержимому переноса. Вы можете попробовать сделать это 0dp. Это создает тот же результат.
Затем я нашел эту ветку, которая рассказывает историю позади "match_parent" оптимизации