저는 Xamarin을 사용하여 크로스 플랫폼 응용 프로그램을 개발 중입니다. Akavache를 발견했지만 listview 어댑터에서 Akavache를 사용하여 이미지로드를 처리 할 수 없습니다. 정말 느리게 작동합니다. 그래서 그것을 고치거나 이것을 처리 할 다른 방법을 찾아야합니다. 좋은 예나 견본을 찾을 수 없었습니다.Akavache를 사용하여 목록보기 어댑터에 이미지 표시
나는 이런 식으로의 getView 방법으로 목록보기 어댑터에 &로드 이미지를 다운로드하려고 : 내 DataCache 클래스에서
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);
}
나는 다음과 같은 방법으로 이미지를 얻는 시도, 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는 : 대상 유형에 소스 유형에서 캐스팅 할 수 없습니다. 48 : 12-11 12 54.560 I/MonoDroid (2,017), (래퍼 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]에서 0 12-11 12 : 48 : 54.572 I/MonoDroid (2017) : - - 예외가 발생 된 이전의 위치에서 스택 트레이스 --- 끝 12-11 12 : 48 (2017) 54.572 I/MonoDroid : 0 : System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()은 0x00000]시 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]시 : 0 처리되지 않은 예외가 발생했습니다.
UPDATE : 바울은 그렇게 나에게 대답 지금은 그들이 UI 요소이기 때문에 내가 IBitmaps와 GetOrFetchObject을 사용할 수 없다는 것을 알고있다. 그래서 예외 메시지는 이제 불필요합니다. 그러나 loadImageFromUrl 메서드는 스크롤하는 동안 UI 스레드를 차단합니다. 그래도 여전히 큰 문제입니다.