使用Picasso将Firebase存储中的图像加载到Infowindow中的ImageView,Picasso仅显示占位符

时间:2016-10-06 12:51:07

标签: android firebase picasso firebase-storage

我尝试将带有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引用了我的问题。

所以我改变了我的代码,但没有用。问题仍然存在。毕加索只展示了占位符。

2 个答案:

答案 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) }
}