在onDataChange + Glide中进行“ for”循环之前,如何等待图像加载?

时间:2018-11-15 07:44:30

标签: java android firebase firebase-realtime-database android-glide

我知道onDataChange下载是异步的,但是主体具有UI线程。使用Glide加载图像也是异步的。 onDataChange正在执行,它涉及UI线程的主体,但是该图像已加载到新线程中,因此该图像没有时间加载,无法进一步执行代码。

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数据库。

如何在“ for”循环进行之前等待图像加载?

3 个答案:

答案 0 :(得分:0)

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);

答案 1 :(得分:0)

如果您使用的是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);

答案 2 :(得分:0)

尝试一下

声明一个全局变量:

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

将网址添加到列表:

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");
    }
  }
}