【问题标题】:Firebase storage onSuccess not being called when image is added添加图像时未调用 Firebase 存储 onSuccess
【发布时间】:2018-05-24 02:41:47
【问题描述】:

我正在尝试使用以下结构将数据保存到 firebase

root
--clothing
----clothingImgDownloadUrl
------title
------category

据我了解,我需要引用数据库中要保存新数据的路径。

FirebaseApp app = FirebaseApp.getInstance();
assert app != null;
mDatabase = FirebaseDatabase.getInstance(app);
mClothingRef = mDatabase.getReference("clothing");

我想使用上面创建的服装参考添加新服装

mClothingRef.child(clothingImgDownloadUrl).setValue(clothing);

但是,上面的代码仅在服装图像上传到 firebase 存储后才会运行,并且其下载 url 会返回到应用程序,在应用程序中它可以用作 firebase 数据库中条目的唯一标识符。以下是将图片上传到 Firebase 存储的代码。

FirebaseStorage storage = FirebaseStorage.getInstance();
StorageReference storageRef = storage.getReference(FIREBASE_STORAGE_CLOTHING_REFERENCE);
StorageReference photoRef = storageRef.child(mSelectedImageUri.getLastPathSegment());
photoRef.putFile(mSelectedImageUri)
        .addOnSuccessListener(this, new OnSuccessListener<UploadTask.TaskSnapshot>() {
            public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
                // When the image has successfully uploaded, we get its download URL
                Log.d("ADMIN_ACTIVITY", "Called");
                Uri downloadUrl = taskSnapshot.getDownloadUrl();
                assert downloadUrl != null;
                String imageUrl = downloadUrl.toString();
                Clothing clothing = new Clothing(imageUrl, title, mCategory);
                mClothingRepository.addClothing(clothing);
             }
         });

当应用程序运行时,我从应用程序的管理部分添加了一件衣服,图像确实被添加到了 firebase 存储中,但是最后一个代码 sn-p 中的 Log 调用没有被调用。当然,如果添加了图像,则应该调用 onSuccess 侦听器,然后运行 ​​addClothing 方法。

为什么没有调用onSuccess 侦听器,我是否正确保存到实时数据库?

【问题讨论】:

    标签: java android firebase firebase-realtime-database firebase-storage


    【解决方案1】:

    您正在使用addOnSuccessListener() 的活动范围形式。文档指出:

    在 onStop() 期间监听器会被自动移除

    没有调用监听器的最可能的解释是作为第一个参数 (this) 传递的活动已经完成并且它的 onStop() 方法被调用。要确认是这种情况,请删除 this 参数并查看是否调用了侦听器。

    【讨论】:

    • 现在我已经删除了 this 作为第一个参数,我的应用程序崩溃了。在 logcat 中没有关于崩溃的信息。
    • logcat 是否显示崩溃前这条语句的输出? Log.d("ADMIN_ACTIVITY", "Called")
    • 实际上日志猫确实提供了有关崩溃的信息。 Firebase 数据库路径无效:Firebase 数据库路径不得包含“.”、“#”,调用 addClothingMethod 时会出现这种情况
    • 听起来您正在尝试使用部分或全部 downloadUrl 来构建 Firebase 参考。那不安全。 URL 可以包含 . 和其他在 Firebase 引用路径中无效的字符。至少这可以确认监听器正在被调用,因此您最初的问题得到了解决。
    • 请注意,虽然使用非活动范围的侦听器解释了为什么不调用侦听器的奥秘,但它可能不是正确的长期解决方案。较大文件的上传可能需要数十秒或更长时间。如果在活动中完成,则存在活动在上传完成之前被销毁的风险。用户可以退出活动或旋转设备,从而导致配置更改。您可能需要重新考虑您的设计或设置保护措施,以确保活动在上传完成之前保持活跃。
    猜你喜欢
    • 2020-07-21
    • 1970-01-01
    • 2022-01-11
    • 1970-01-01
    • 2020-04-20
    • 2020-04-21
    • 1970-01-01
    • 2022-08-18
    • 1970-01-01
    相关资源
    最近更新 更多