Java 毕加索可以';t在StorageReference'中加载图像;s onSuccess方法

Java 毕加索可以';t在StorageReference'中加载图像;s onSuccess方法,java,android,firebase,picasso,firebase-storage,Java,Android,Firebase,Picasso,Firebase Storage,在运行时onStart()方法上尝试毕加索时,它通常使用控制台的下载链接从Firebase加载图像 但是,当我尝试在StorageReferenceonSuccess方法中加载图像时,它就是不起作用 此类正在扩展片段: @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, d

在运行时
onStart()
方法上尝试毕加索时,它通常使用控制台的下载链接从Firebase加载图像

但是,当我尝试在StorageReference
onSuccess
方法中加载图像时,它就是不起作用


此类正在扩展片段:

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    if (requestCode == GALLERY_IN && resultCode == Activity.RESULT_OK) {
        isGranted = true;
        String path = FireStorage.retUID() + "/";
        showIndProgress();
        Uri uri = data.getData();

        StorageReference childPathRef = FireStorage.storageRef.child(path + uri.getLastPathSegment());
        childPathRef.putFile(uri)
                .addOnCompleteListener(new OnCompleteListener<UploadTask.TaskSnapshot>() {
                    @Override
                    public void onComplete(@NonNull Task<UploadTask.TaskSnapshot> task) {
                        if(task.isSuccessful()) {
                            Picasso.with(mContext).load(task.getResult().getDownloadUrl())
                                    .into(profView);

                            Picasso.Builder build = new Picasso.Builder(mContext);
                            build.listener(new Picasso.Listener() {
                                @Override
                                public void onImageLoadFailed(Picasso picasso, Uri uri, Exception exception) {
                                    Toast.makeText(mContext, "exception\n" + exception.toString(), Toast.LENGTH_SHORT).show();

                                }
                            });
                            progressDialog.dismiss();
                        } else {
                            //failed
                        }

                    }
                });

    }

}
舱单:

<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

更新2:

ImageView profView = (ImageView) view.findViewById(R.id.profPhoto);
虽然我发布的代码对我有效,但您表示它对您无效。我的测试没有使用片段,我不知道您使用的库的版本,现在已经知道如何将片段添加到布局中,等等。有太多可能的原因导致不同的行为,因此无法有效地对其进行调试

作为实验,您可以尝试使用Glide和FirebaseUI来执行下载,而不是使用毕加索。代码如下所示,适用于我。因为下载来自存储引用而不是URL,所以这种方法需要对存储进行读取访问。您还需要将以下行添加到生成依赖项中:

// FirebaseUI 2.0.1 is the version to use for Firebase SDK version 11.0.1
// SDK/Firebase version compatibility is important.
// See the FirebaseUI docs for a table of compatible versions.
compile 'com.firebaseui:firebase-ui-storage:2.0.1'
compile 'com.github.bumptech.glide:glide:3.8.0'


在这一行代码中,有可能:

     Picasso.with(mContext).load(task.getResult().getDownloadUrl())
                                .into(profView);    
profView正在使用fragment重新创建,并且
Picasso.into(View视图)
保留对视图的周引用

从文档:

将public void异步导入(android.widget.ImageView目标) 在指定的ImageView中完成请求。注:此方法 保持对ImageView实例的弱引用,并将 自动支持对象回收

尝试使用:

public void into(@NotNull ImageView target,
             Callback callback)

我刚从CircleImageView切换到正常的图像视图,它突然工作了。

可能与
CircleImageView
冲突

尝试使用ImageView更改它,或者像定义
图像视图一样定义
圆形图像视图

试试看:

ImageView profView = (ImageView) view.findViewById(R.id.profPhoto);
限制

  • ScaleType总是居中,如果您试图更改它,就会出现异常。这是(目前)由设计,因为它是完美的个人资料图像罚款
  • 不支持启用adjustViewBounds,因为这需要不受支持的ScaleType
  • 如果您使用像毕加索或Glide这样的图像加载库,则需要禁用它们的淡入淡出动画以避免图像混乱。对于毕加索,使用noFade()选项;对于Glide,使用dontAnimate()。如果要保留fadeIn动画,则必须将图像提取到目标中,并在接收位图时自己应用自定义动画。
  • 将TransitionDrawable与CircleImageView一起使用无法正常工作,会导致图像混乱

你好,鲍勃,谢谢你的回答,不幸的是,图像仍然没有显示,但我可以向你保证,图像已成功上载,因为我可以在Firebase storage.Strange中看到它。当我下载到ImageView时,代码对我有效。这个类是在扩展片段,也许它与生命周期有关?我真的不知道。@HUSTLE:我更新了我的答案,包括
.noFade()
.fit()
。这些对我有用。我很快会添加解释。这对我来说没问题。调查其余可能的原因需要查看更多代码,并且很难处理评论和帖子。我休息一下。希望其他人能提供帮助。我对毕加索的profView也有类似的问题,请从以下行签出:Picasso.with(mContext).load(task.getResult().getDownloadUrl()).into(profView);profView可以用Fragment重新创建,毕加索的请求也完成了。@Wrobel如果您解决了相同的问题,您可以共享您的代码或将其发布在下面的答案中吗?它说不允许添加注释。
StorageReference childPathRef = Class.storageRef.child(path + uri.getLastPathSegment());
childPathRef.putFile(uri).addOnCompleteListener(new OnCompleteListener<UploadTask.TaskSnapshot>() {
    @Override
    public void onComplete(@NonNull Task<UploadTask.TaskSnapshot> task) {
        if (task.isSuccessful()) {
            Log.d(TAG, "Upload: SUCCESS");
            Picasso.with(mContext)
                .load(task.getResult().getDownloadUrl())
                .noFade()
                .fit()
                .into(profView, new Callback() {
                    @Override
                    public void onSuccess() {
                        Log.d(TAG, "Download: SUCCESS");
                        Toast.makeText(mContext, "download done" , Toast.LENGTH_SHORT).show();                        }

                    @Override
                    public void onError() {
                        Log.d(TAG, "Download: FAILED");
                    }
                });
            Toast.makeText(mContext, "upload done" , Toast.LENGTH_SHORT).show();
        } else {
            Log.e(TAG, "Upload: FAILED: " + task.getException().getMessage());
        }
        progressDialog.dismiss();
    }
});
     Picasso.with(mContext).load(task.getResult().getDownloadUrl())
                                .into(profView);    
public void into(@NotNull ImageView target,
             Callback callback)
ImageView profView = (ImageView) view.findViewById(R.id.profPhoto);