2014-07-10 13 views
10

Miałem metodę, która ładuje obrazy, jeśli obraz nie został załadowany, zanim będzie go szukać na serwerze. Następnie przechowuje je w systemie plików aplikacji. Jeśli jest w systemie plików, ładuje ten obraz, ponieważ jest to znacznie szybsze niż pobieranie obrazów z serwera. Jeśli wcześniej załadowałeś obraz bez zamykania aplikacji, zostanie on zapisany w statycznym słowniku, aby można go było ponownie załadować bez zużywania większej ilości pamięci, aby uniknąć błędów związanych z pamięcią.Pobierz bitmapę z ImageView załadowaną Picasso

To wszystko działało bez zarzutu, dopóki nie zacząłem korzystać z biblioteki ładującej obraz Picasso. Teraz ładuję obrazy do ImageView, ale nie wiem, jak uzyskać zwróconą mapę bitową, aby móc ją zapisać w pliku lub statycznym słowniku. To utrudniło sprawę. ponieważ oznacza to, że próbuje załadować obraz z serwera za każdym razem, co jest czymś, czego nie chcę. Czy istnieje sposób, w jaki mogę uzyskać bitmapę po załadowaniu jej do ImageView? Poniżej znajduje się mój kod:

public Drawable loadImageFromWebOperations(String url, 
     final String imagePath, ImageView theView, Picasso picasso) { 
    try { 
     if (Global.couponBitmaps.get(imagePath) != null) { 
      scaledHeight = Global.couponBitmaps.get(imagePath).getHeight(); 
      return new BitmapDrawable(getResources(), 
        Global.couponBitmaps.get(imagePath)); 
     } 
     File f = new File(getBaseContext().getFilesDir().getPath() 
       .toString() 
       + "/" + imagePath + ".png"); 

     if (f.exists()) { 
      picasso.load(f).into(theView); 
      **This line below was my attempt at retrieving the bitmap however 
      it threw a null pointer exception, I assume this is because it 
      takes a while for Picasso to add the image to the ImageView** 
      Bitmap bitmap = ((BitmapDrawable)theView.getDrawable()).getBitmap(); 
      Global.couponBitmaps.put(imagePath, bitmap); 
      return null; 
     } else { 
      picasso.load(url).into(theView); 
      return null; 
     } 
    } catch (OutOfMemoryError e) { 
     Log.d("Error", "Out of Memory Exception"); 
     e.printStackTrace(); 
     return getResources().getDrawable(R.drawable.default1); 
    } catch (NullPointerException e) { 
     Log.d("Error", "Null Pointer Exception"); 
     e.printStackTrace(); 
     return getResources().getDrawable(R.drawable.default1); 
    } 
} 

Każda pomoc będzie bardzo ceniona, dziękuję!

+0

Picasso nie będzie ładował obrazów z serwera za każdym razem. Tylko za pierwszym razem ładuje się z katalogu pamięci podręcznej. – intrepidkarthi

Odpowiedz

7

Picasso daje bezpośrednią kontrolę nad pobranymi obrazami. Aby zapisać pobrane obrazy do pliku zrobić coś takiego:

Picasso.with(this) 
    .load(currentUrl) 
    .into(saveFileTarget); 

Gdzie:

saveFileTarget = new Target() { 
    @Override 
    public void onBitmapLoaded (final Bitmap bitmap, Picasso.LoadedFrom from){ 
     new Thread(new Runnable() { 
      @Override 
      public void run() { 
       File file = new File(Environment.getExternalStorageDirectory().getPath() + "/" + FILEPATH); 
       try { 
        file.createNewFile(); 
        FileOutputStream ostream = new FileOutputStream(file); 
        bitmap.compress(CompressFormat.JPEG, 75, ostream); 
        ostream.close(); 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
      } 
     }).start(); 
    } 
} 
+0

Czy można to również zrobić za pomocą przeciągnięcia? (że próbuję tp dołączyć do EditText) Nie otrzymuję żadnych błędów, ale nie działa – Sauron

0

Ponieważ używasz Picasso, można również chcą, aby w pełni wykorzystać. Zawiera potężny mechanizm buforowania.

Użyj picasso.setDebugging(true) na swojej instancji Picasso, aby zobaczyć, jaki rodzaj buforowania występuje (obrazy są ładowane z dysku, pamięci lub sieci). Patrz: http://square.github.io/picasso/ (wskaźniki debugowania)

Domyślna instancja Picasso jest skonfigurowany (http://square.github.io/picasso/javadoc/com/squareup/picasso/Picasso.html#with-android.content.Context-)

cache LRU 15% dostępnych aplikacji RAM

cache dyskowe od 2% przestrzeni aż do przechowywania do 50 MB, ale nie mniej niż 5 MB. (Uwaga: to jest dostępne tylko na API 14+ lub jeśli używasz autonomiczną bibliotekę, która zapewnia cache dysku na wszystkich poziomach API jak OkHttp)

Można także określić instancję Cache użyciu Picasso.Builder dostosować instancji i możesz określić swoją Downloader dla lepszej kontroli. (W Picasso jest implementacja OkDownloader, która jest używana automatycznie, jeśli w aplikacji podłączysz OkHttp).

34

Dzięki Picasso nie musisz implementować własnego statycznego słownika, ponieważ jest on wykonywany automatycznie. @intrepidkarthi miał rację w tym sensie, że obrazy są automatycznie buforowane przez Picasso przy pierwszym załadowaniu i dlatego nie wywołuje on stale serwera, aby uzyskać ten sam obraz.

Stwierdziłem, że znalazłem się w podobnej sytuacji: musiałem uzyskać dostęp do mapy bitowej, która została pobrana w celu zapisania jej w innym miejscu w mojej aplikacji. Za to, że manipulowane odpowiedź @Gilad Haimov trochę:

Picasso.with(this) 
     .load(url) 
     .into(new Target() { 
      @Override 
      public void onBitmapLoaded (final Bitmap bitmap, Picasso.LoadedFrom from) { 
       /* Save the bitmap or do something with it here */ 

       //Set it in the ImageView 
       theView.setImageBitmap(bitmap); 
      } 

      @Override 
      public void onPrepareLoad(Drawable placeHolderDrawable) {} 

      @Override 
      public void onBitmapFailed(Drawable errorDrawable) {} 
    }); 

To daje dostęp do załadowanej bitmapy jednocześnie ładuje je asynchronicznie.Trzeba tylko pamiętać, aby ustawić go w ImageView, ponieważ nie jest już automatycznie wykonywane dla ciebie.

Na marginesie, jeśli chcesz wiedzieć, skąd pochodzi twój obraz, możesz uzyskać dostęp do tych informacji w ramach tej samej metody. Drugi argument powyższej metody, Picasso.LoadedFrom from, jest wyliczeniem, które pozwala dowiedzieć się, z jakiego źródła została załadowana mapa bitowa (trzy źródła to: DISK, MEMORY i NETWORK. (Source). Square Inc. zapewnia także wizualny sposób widząc gdzie bitmap został załadowany z za pomocą wskaźników debugowania wyjaśnił here.

Nadzieja to pomaga!

-1

Użyj tego

Picasso.with(context) 
.load(url) 
.into(imageView new Callback() { 
    @Override 
    public void onSuccess() { 
     //use your bitmap or something 
    } 

    @Override 
    public void onError() { 

    } 
}); 

Mam nadzieję, że pomoże Ci

+2

'onSuccess()' nie udostępnia obiektu Bitmap. – Hemanth

+0

Hemanth wystarczy przekonwertować lub użyć Target. Cel udostępnia bitmapę! – Madi

0

W tym przykładzie użyłem ustawienia tła paska narzędziowego.

public class MainActivity extends AppCompatActivity { 

CollapsingToolbarLayout colapsingToolbar; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

    colapsingToolbar = (CollapsingToolbarLayout) findViewById(R.id.colapsingToolbar); 
    ImageView imageView = new ImageView(this); 
    String url ="www.yourimageurl.com" 


    Picasso.with(this) 
     .load(url) 
     .resize(80, 80) 
     .centerCrop() 
     .into(image); 

    colapsingToolbar.setBackground(imageView.getDrawable()); 

} 

Mam nadzieję, że ci pomogło.

Powiązane problemy