我尝试将带有Picasso的Firebase存储中的图像加载到从Marker放置在InfoWindowAdapter中的Imageview中。
我非常绝望。问题是Picasso只显示占位符Icon。
FirebaseStorageRefernce
的代码如下所示:Firebase Blog post:
StorageReference load = getImage(id);
load.getDownloadUrl().addOnSuccessListener(new OnSuccessListener<Uri>() {
@Override
public void onSuccess(Uri uri) {
downloadUri = uri;
}
}).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
Log.e("Failure",e.toString());
}
});
我得到的downloadUri有效且工作正常。现在我将这个downloadUri用于Picasso。
Picasso picasso = new Picasso.Builder(getApplicationContext()).listener(new Picasso.Listener() {
@Override
public void onImageLoadFailed(Picasso picasso, Uri uri, Exception e) {
e.printStackTrace();
}
}).build();
picasso.setLoggingEnabled(true);
picasso.load(downloadUri).placeholder(R.drawable.toxic_bait_icon).fit().into(thump, new MarkerCallback(marker));
参考我在StackOverFlow上找到的answer,我做了一个MarkerCallback类:
public class MarkerCallback implements Callback {
com.google.android.gms.maps.model.Marker marker = null;
MarkerCallback(Marker marker)
{
this.marker = marker;
}
@Override
public void onError(){
Log.e(getClass().getSimpleName(), "Error loading thumbnail!");
}
@Override
public void onSuccess(){
Log.d("onSuccess","Picasso Callback");
if(marker != null && marker.isInfoWindowShown()){
Log.d("onSuccess","Picasso Callback in if");
marker.hideInfoWindow();
marker.showInfoWindow();
}
}}
您可以看到我在Log.d
方法上添加了一些onSuccess
条消息,以跟踪它是否被调用。但看起来onSucess
方法不会随时调用,因为Log.d
消息永远不会出现在LogCat中。
即使我启用了Picasso也没有显示任何异常,错误,失败和日志。
picasso.setLoggingEnabled(true);
唯一发生的事情是Infowindow中的ImageView显示占位符。
我想也许是因为图像尺寸太大而无法加载,但我尝试加载的图像只有652.86 KB。
PS:Picasso也没有显示左角的色带来调试缓存行为。我尝试激活:
picasso.setIndicatorsEnabled(true);
我使用Picasso 2.5.2。如果Picasso没有显示日志和色带,我不知道我做错了什么或如何调试它。我希望有一个人可以帮助我。我非常需要这个功能。
附录: 我还检查了权限,参考这个post,它们没问题。
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission
android:name="android.permission.INTERNET"/>
<uses-permission
android:name="android.permission.READ_SYNC_SETTINGS"/>
<uses-permission
android:name="android.permission.WRITE_SYNC_SETTINGS"/>
<uses-permission
android:name="android.permission.AUTHENTICATE_ACCOUNTS"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.CALL_PHONE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
更新
经过一些反复试验,我发现Picasso显示了日志,但我没有在logcat中看到它。重新启动手机后,我在一段时间后看到了logcat中的日志。日志再次消失,但这次即使重启也没有帮助,日志不再出现。
但我也做了一些研究,发现另一个answer引用了我的问题。
所以我改变了我的代码,但没有用。问题仍然存在。毕加索只展示了占位符。
答案 0 :(得分:5)
为什么不一次做所有事情? Firebase存储中的getDownloadUrl()方法:
StorageReference load = getImage(id);
load.getDownloadUrl().addOnSuccessListener(new OnSuccessListener<Uri>() {
@Override
public void onSuccess(Uri uri) {
// Got the download URL for 'users/me/profile.png'
// Pass it to Picasso to download, show in ImageView and caching
Picasso.with(context).load(uri.toString()).into(imageView);
}
}).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception exception) {
// Handle any errors
}
});
答案 1 :(得分:0)
将Kotlin扩展函数用作Task<Uri>
作为接收者:
fun Task<Uri>.loadIntoPicasso(imageView: ImageView){
addOnSuccessListener { Picasso.with(imageView.context).load(it).into(imageView) }
}