我知道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”循环进行之前等待图像加载?
答案 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");
}
}
}