2014-12-11 5 views
1

저는 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 스레드를 차단합니다. 그래도 여전히 큰 문제입니다.

답변

1

마지막으로 문제를 해결했습니다. 우선, 다른 라이브러리 (MonoDroid.UrlImageViewHelper)를 시도하여 Akavache 문제가 아님을 알아 냈습니다. 그런 다음 문제는 listview 자체에 관한 문제 일 수 있다고 생각했습니다. 나는 선임 개발자이기 때문에 listview 최적화를 알고 있지만 여전히 뭔가를 놓친지를 알기 위해 새로운 최적화 전술을 찾는다. 모든 리터의

먼저이 사이트를보고 추천 : http://leftshift.io/6-ways-to-make-your-lists-scroll-faster-than-the-wind

는 이미 이러한 제안을 많이 알고하지만 실제 차이가 랩 내용에서 부모와 일치하도록 목록보기의 높이를 변화되어 있는지 확인합니다. 0dp로 만들 수도 있습니다. 동일한 결과를 만듭니다.

은 그 때 나는 "match_parent"최적화

Why is 0dp considered a performance enhancement?

뒤에 이야기를이 스레드를 발견