2017-01-02 2 views
1

У меня есть RecyclerView, и каждый товар RecyclerView имеет ImageView. Я загружаю изображение в ImageView с использованием Glide. Я видел, как некоторые блоги говорят, что Glide может загружать изображение асинхронно, но я не вижу этого из кода ниже. Кажется, он загружает только одно изображение, когда вызывается onBindViewHolder. Как он показывает асинхронность?Как изображение скольжения скольжения асинхронно?

public class GalleryAdapter extends RecyclerView.Adapter<GalleryAdapter.ViewHolder> { 
     private Context mContext; 
     private List<GalleryItem> mList; 

     public GalleryAdapter(Context mContext, List<GalleryItem> mList) { 
      this.mContext = mContext; 
      this.mList = mList; 
     } 

     public static class ViewHolder extends RecyclerView.ViewHolder { 
      public ImageView mImageView; 
      public ViewHolder(View itemView) { 
       super(itemView); 
       mImageView = (ImageView) itemView.findViewById(R.id.gallery_item); 
      } 
     } 

     @Override 
     public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
      View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.adapter_gallery, 
       parent, false); 
      ViewHolder vh = new ViewHolder(v); 
      return vh; 
     } 

     @Override 
     public void onBindViewHolder(ViewHolder holder, int position) { 
      GalleryItem item = mList.get(position); 
      holder.mImageView.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View v) { 

       } 
      }); 
      Glide.with(mContext) 
        .load(item.getUrl()) 
        .thumbnail(0.5f) 
        .into(holder.mImageView); 
     } 

     @Override 
     public int getItemCount() { 
      return mList.size(); 
     } 

     public void addAll(List<GalleryItem> newList) { 
      mList.addAll(newList); 
     } 

     public void clear() { 
      mList.clear(); 
     } 
    } 
+0

При прокрутке recyclerView 'onBindViewHolder()' вызывается много раз для загрузки каждого элемента, и для каждого элемента Glide загружает изображение в поток и устанавливает его в imageView, и даже кэширование изображения выполняется им , –

+0

@dashenswen Процитированная вами цитата не относится к коду, который вы указали. Речь идет о том, как Glide выполняет асинхронную работу за капотом. В основном Glides создает определенное количество потоков, а загрузка и кэширование организовано в виде очередей. – Enzokie

+0

@ AkshayBhat'AB '. Да, я снова прочитал документ и впечатлен им. Кстати, вы знаете, почему они могут кэшировать так много фотографий? В документе указано изображение кэш-памяти Glide в памяти. Но когда я просматриваю свой recycleview и загружаю 5000+ изображений, у него нет проблемы с OOM. Ты знаешь почему? Даже Glide загружает изображение с более низким качеством, это действительно впечатляет меня в этом вопросе. – dashenswen

ответ

1

Согласно глиссаде документации here и here вы должны использовать метод в(), который возвращает FutureTarget, а не тот, который возвращает объект. Этот метод принимает ширину и высоту, а не ImageView: «Если вы действительно хотите взаимодействовать с декодированным изображением в фоновом потоке, вместо использования downloadOnly вы можете использовать версию в(), которая возвращает FutureTarget».

+1

Я не совсем понимаю ваше объяснение. Связано ли это с объяснением того, как изображение скольжения загружается асинхронно? – dashenswen