无法结合Glide与Firebase Storage加载图片问题求助
解决方法
问题核心是异步操作的时序问题:getDownloadUrl()是异步执行的,你在调用thread.start()后立刻执行Glide加载,此时onSuccess还没触发,imgUrl还没被赋值,自然加载失败。
直接修改代码,把Glide的加载逻辑放到onSuccess回调内部,确保拿到有效链接后再执行加载:
// 无需额外开Thread,Firebase API本身就是异步的 imgRef.getDownloadUrl().addOnSuccessListener(new OnSuccessListener<Uri>() { @Override public void onSuccess(Uri uri) { String imgUrl = uri.toString(); // 存入数据库 myImg.setValue(imgUrl); // 拿到链接后立刻用Glide加载 Glide.with(MainActivity.this).load(imgUrl).into(imageView); } }).addOnFailureListener(new OnFailureListener() { @Override public void onFailure(@NonNull Exception exception) { System.out.println("获取图片链接失败:" + exception.getMessage()); } });
如果需要等待数据库写入成功后再加载,可以监听setValue的完成回调:
imgRef.getDownloadUrl().addOnSuccessListener(new OnSuccessListener<Uri>() { @Override public void onSuccess(Uri uri) { String imgUrl = uri.toString(); myImg.setValue(imgUrl).addOnCompleteListener(new OnCompleteListener<Void>() { @Override public void onComplete(@NonNull Task<Void> task) { if (task.isSuccessful()) { // 数据库写入成功后加载图片 Glide.with(MainActivity.this).load(imgUrl).into(imageView); } else { System.out.println("数据库写入失败:" + task.getException().getMessage()); } } }); } }).addOnFailureListener(new OnFailureListener() { @Override public void onFailure(@NonNull Exception exception) { System.out.println("获取图片链接失败:" + exception.getMessage()); } });
另外,Glide本身支持直接加载Uri,无需转成字符串,也可以这样写:
Glide.with(MainActivity.this).load(uri).into(imageView);
内容的提问来源于stack exchange,提问作者Kenan
相关产品推荐
相关产品推荐

