2014-10-09 7 views
11

Chcę pokazać serię zdjęć bez przerw między zdjęciami, w których zdjęcia zmieniają się w regularnych odstępach czasu. Zdałem sobie sprawę, że Picasso inicjuje ImageView zanim zacznie pobierać i zawsze to robi, bez względu na to, czy pobieram() czy nie przed wywołaniem w().Pobieranie obrazów z funkcją oddzwaniania w Picasso?

I fetch(), aby zachować lukę między obrazami małe, a także użyj .placeholder (R.color.black), ale luka jest nadal widoczny, nawet gdy obraz jest ładowany z pamięci.

Mój kod wygląda następująco

Picasso.with(getContext()).load(url).fetch(); 

potem z opóźnieniem [który jest obecnie ustalić i którego chcę, aby dostosować zależy od szybkości sieci]

Picasso.with(getContext()).load(url).into(screenSurface); 

zauważyłem, że fetch() nie nie obsługuje żadnych parametrów wywołania zwrotnego i zwraca nieważne, więc wydaje mi się, że nie jest mi wiadomo, kiedy pamięć podręczna jest rozgrzana.

dwa pytania:

  1. mogę dostać zauważyłem, kiedy obraz jest buforowane?
  2. Czy istnieje inny sposób na pozbycie się przerw między obrazami i sprawienie, by były regularnie wyświetlane.

[Wiem, że mógłbym to jakoś kodować ręcznie, ale jeśli Picasso wspiera go, chciałbym go używać.]

Odpowiedz

15

Na podstawie the source wygląda na to, że fetch nic nie robi po zakończeniu, w tym powiadomienie potencjalnych słuchaczy. Niestety, FetchAction nie jest klasą publiczną, więc nie można jej również zastąpić.

Można obejść ten problem poprzez zastosowanie niestandardowych Target podklasy, tak:

Picasso.with(getContext()).load(url).into(new Target() { 
    @Override public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) { 
     // cache is now warmed up 
    } 
    @Override public void onBitmapFailed(Drawable errorDrawable) { } 
    @Override public void onPrepareLoad(Drawable placeHolderDrawable) { } 
}); 
+0

To jest bardzo ładne, ale zdałem sobie sprawę, że nie mogę używać funkcji, takich jak .fit() lub .centerCrop(), ponieważ użyłem ich wcześniej, co nie jest problemem, ponieważ mogę ustawić odpowiednie atrybuty w ImageView. Ale chciałbym wiedzieć, czy użycie Target() ma jakiekolwiek znaczenie dla buforowania obrazów.Czy obrazy są zapisywane w pamięci podręcznej jako pobrane, więc mogę je technicznie wykorzystać w podglądach o różnych rozmiarach? Czy muszę ręcznie .resize() ręcznie lub coś podobnego? –

+2

Możesz wywołać 'load (url) .fit(). W (screenSurface)' po użyciu obejścia w moim rozwiązaniu i dopóki 'url' jest taki sam, wierzę, że zostanie załadowany z pamięci podręcznej. – bmat

0

Sposób .into() zapewnia drugi argument, który jest zwrotna do sukcesu i porażki . Możesz go użyć, aby śledzić, kiedy pojawił się obraz.

Javadoc: http://square.github.io/picasso/javadoc/com/squareup/picasso/RequestCreator.html#into-android.widget.ImageView-com.squareup.picasso.Callback-

Wystarczy popatrzeć na to: How to implement my own disk cache with picasso library - Android? sam Jake Wharton ma tam odpowiedź.

+0

Dzięki, jestem świadoma zwrotnego w pod() i używam go, ale aby uzyskać płynną sekwencję obrazów, potrzebuję informacji, jeśli/kiedy obraz jest załadowany przed do wywołania funkcji(). Zajmę się wdrażaniem własnej pamięci podręcznej dysku, która może rozwiązać problem. –

5

Wiem, że to pytanie jest starszy, ale komenda fetch() umożliwia wywołań zwrotnych, takich jak fetch(Callback callback). Ma to wywołanie zwrotne i onError() dla żądanego obciążenia URI.

Zobacz here po szczegóły javadoc