2015-11-15 2 views
0

Я пытаюсь загрузить несколько изображений из некоторых URL-адресов, используя библиотеку picasso.Загрузите несколько изображений с помощью picasso - Android

До сих пор я пытался этот код:

for(int i = 0; i < friends.size(); i++) 
    { 
     final Profile profile = friends.get(i); 
     String url = profile.getUserImageUrl(); 


     Picasso.with(getContext()).load(url).into(new Target() { 
      // It doesn't reach any of the code below ....!! 

      @Override 
      public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) { 
       profile.setUserImage(bitmap); 
       counter++; 

       if(counter >= friends.size() - 1) 
        cards(); 
      } 

      @Override 
      public void onBitmapFailed(Drawable drawable) { 
       Log.e("App", "Failed to load company logo in onBitmapFailed method"); 
      } 

      @Override 
      public void onPrepareLoad(Drawable drawable) { 
       Log.e("App","Failed to load company logo in onBitmapFailed method"); 
      } 

     }); 
    } 

Этот код не работает. Когда я запускаю этот код, он не достигает ни одной строки в интерфейсе Target. У кого-то есть идеи для чего?

ответ

0

Возможно, мне что-то не хватает, но я думаю, что into() принимает только ImageView и необязательно Callback. Вы можете сделать что-то вроде этого:

Picasso 
    .with(getContext()) 
    .load(profile.getUserImageUrl()) 
    .into(imageView, new Callback() 
    { 
     @Override 
     public void onSuccess() 
     { 
      // Update card 
     } 

     @Override 
     public void onError() 
     { 
      Log.e("App","Failed to load company logo"); 
     } 
    }); 

Но давайте попробуем это: Я предполагаю, что вы либо пытаюсь добавить изображения профиля в кучу существующих представлений, или динамически пытаюсь создать эти взгляды, как вы перебрать все профили. Вот решение для обоих случаев:

for (int i = 0; i < friends.size(); i++) 
{ 
    Profile profile = friends.get(i); 
    if (profile != null) 
    { 
     /** Either find an existing view like this: **/ 

     // You're assembling a resource ID here. 
     String resourceName = "profile_" + profile.getId(); // Assuming you have an ID. 
     int resourceId = getResources().getIdentifier(resourceName, "id", getActivity().getPackageName()); 

     // Use it to get the image view in your activity's layout. 
     ImageView imageView = (ImageView) findViewById(resourceId); 
     if (imageView != null) 
     { 
      Picasso 
        .with(this) 
        .load(profile.getUserImageUrl()) 
        .into(imageView); 
     } 

     /** Or inflate a View like this: **/ 

     // Get a containing view. You should move this above your 
     // loop--it's here so I can keep these blocks together. 
     FrameLayout frameLayout = (FrameLayout) findViewById(R.layout.frame_layout); 

     // This is a layout that contains your image view and 
     // any other views you want associated with a profile. 
     View view = LayoutInflater.from(this).inflate(R.layout.profile_layout, null, false); 

     // You're finding the view based from the inflated layout, not the activity layout 
     ImageView imageView = (ImageView) view.findViewById(R.id.image_view); 
     if (imageView != null) 
     { 
      Picasso 
        .with(this) 
        .load(profile.getUserImageUrl()) 
        .into(imageView); 
     } 

     frameLayout.addView(view); 
    } 
} 
0

Вам просто нужно сохранить сильную ссылку на Target пока запрос работает. И вам также нужен другой экземпляр Target для каждого изображения, которое вы собираетесь загрузить (потому что, если я не ошибаюсь, Picasso отменит предыдущий запрос для Target, если новый будет запущен для того же Target).

ОБЪЯСНЕНИЕ:

Фактическая причина у вас возникла такая проблема заключается в следующем:

Примечание: Этот метод сохраняет слабую ссылку на экземпляр Target и будет мусора, если вы не держите на ней сильную ссылку. Для получения обратных вызовов при загрузке изображения используйте в (android.widget.ImageView, Callback).

Источник: http://square.github.io/picasso/2.x/picasso/com/squareup/picasso/RequestCreator.html#into-com.squareup.picasso.Target-

Итак, в целом:

В большинстве случаев, вы должны использовать это, когда вы имеете дело с индивидуальным видом или владельцем вида, который должен реализовать интерфейс Target.

НО:

В вашем случае я думаю, что лучшее решение действительно просто создать/найти ImageViews заранее и иметь Пикассо нагрузки изображения непосредственно в них.

Смежные вопросы