Как дождаться загрузки изображения, прежде чем цикл on for будет продолжен в onDataChange + Glide? - PullRequest
0 голосов
/ 15 ноября 2018

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

myRef.addListenerForSingleValueEvent(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        for(DataSnapshot ds : dataSnapshot.getChildren()) {
              ...
              if(word.contains("https")){
                  Glide.with(Activity.this)
                  .load(url)
                  .into(imageView);
              }else{
                  Log.d(TAG, "Another");
              }
         }
    }
}

Это база данных Firebase.

Как дождаться загрузки изображения перед продолжением цикла «для»?

Ответы [ 3 ]

0 голосов
/ 15 ноября 2018

Если вы используете Glide-v4, вы можете настроить прослушиватель для загрузки изображения следующим образом:

Glide.with(Activity.this)
        .load(url)
        .listener(new RequestListener<Drawable>() {

            @Override
            public boolean onLoadFailed(@Nullable GlideException e, Object model, Target<Drawable> target, boolean isFirstResource) {
                return false;
            }

            @Override
            public boolean onResourceReady(Drawable resource, Object model, Target<Drawable> target, DataSource dataSource, boolean isFirstResource) {
                imageSend(imageView);
                return false;
            }
        })
        .into(imageView);
0 голосов
/ 15 ноября 2018

Попробуйте,

Объявите глобальную переменную:

ArrayList<String> list = new ArrayList<>();

добавьте URL-адреса в список:

myRef.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
    for(DataSnapshot childDS : dataSnapshot.getChildren()){
       list.add(childDS.getValue(String.class));
   }
   setImages(list); // this function will be called only after all the URLs are added to the list 
 }
}

Создайте новый метод:

void setImages(ArrayList<String> urlList){
  for(int i = 0; i<urlList.size; i++){
   if(urlList.get(i).contains("https")){
         Glide.with(Activity.this)
         .load(url)
         .into(imageView);
         imageSend(imageView);
    }else{
         Log.d(TAG, "Another");
    }
  }
}
0 голосов
/ 15 ноября 2018

Поместите логику Glide в метод, передавая dataSnapshot в качестве параметра. Примерно так:

Glide.with(Activity.this)
 .load(url)
 .listener(new RequestListener<String, GlideDrawable>() {
     @Override
     public boolean onException(Exception e, String model, Target<GlideDrawable> target, boolean isFirstResource) {
         return false;
     }

     @Override
     public boolean onResourceReady(GlideDrawable resource, String model, Target<GlideDrawable> target, boolean isFromMemoryCache, boolean isFirstResource) {
         imageSend(imageView);
         return false;
     }
 })
 .into(imageView);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...