【问题标题】:Task com.google.firebase.a.v rejected from java.util.concurrent.ThreadPoolExecutor任务 com.google.firebase.a.v 被 java.util.concurrent.ThreadPoolExecutor 拒绝
【发布时间】:2018-02-04 12:27:17
【问题描述】:

朋友们,

我想知道这个错误。我在 Android 中使用 Firebase。完整的错误是:

Fatal Exception: java.util.concurrent.RejectedExecutionException
Task com.google.firebase.a.v@61b9a00 rejected from java.util.concurrent.ThreadPoolExecutor@eacc239[Running, pool size = 2, active threads = 2, queued tasks = 128, completed tasks = 0]

错误发生在Fragment 内的DataChange 上,该Fragment 正在读取信息以填充RecyclerView

我想知道为什么会发生这种情况以及我应该如何避免这个错误。

谢谢你,对不起,因为我知道我没有详细解释这个问题,但我真的不知道为什么会这样。

编辑

这是我意识到它显示错误的代码。这一切都是从我尝试同时上传超过 5 张图片开始的。

if (!pet.isUploaded()) {
    File image = new File(pet.getPicPath());
    final StorageReference referenceImage = storageRef.child("Adopcion" + "/" + pet.getOwner() + "/" + "Adopcion" + "/" + pet.getName() + pet.getAnimalID());

    Uri image2 = Uri.parse("");
    if (image.exists()) {
        image2 = Uri.fromFile(new File(image.toURI()));
    }

    UploadTask taskImage = referenceImage.putFile(image2);

    taskImage.addOnCompleteListener(new OnCompleteListener<UploadTask.TaskSnapshot>() {
        @Override
        public void onComplete(@NonNull Task<UploadTask.TaskSnapshot> task) {
            if (task.isSuccessful()) {
                if (task.getResult().getDownloadUrl() != null) {
                    pet.setUploaded(true);
                    pet.setPicPath(task.getResult().getDownloadUrl().toString());
                    mReference.child(String.valueOf(pet.getAnimalID())).setValue(pet).addOnCompleteListener(new OnCompleteListener<Void>() {
                        @Override
                        public void onComplete(@NonNull Task<Void> task) {
                            if (getActivity() != null) {
                                File folder = getActivity().getCacheDir();
                                File myFile = new File(folder, String.valueOf(pet.getAnimalID()) + ".jpg");
                                if (myFile.exists()) {
                                    myFile.delete();
                                }
                            }
                        }

                    });
                }
            }

        }
    });
}

编辑修复

这个问题是因为图片被上传了很多次,因为一旦上传成功,我将我的宠物状态 isUploaded 更改为 true。但是,Firebase 需要几秒钟来进行更改,因此图像被上传了很多次。

我为解决此问题所做的工作可能不是解决它的最佳方法,但在我找到更好的方法之前它会起作用。 我只是使用一个数组来存储宠物id,一旦上传完成,我跟踪宠物id就知道图片已经上传了,然后防止图片再次排队。

在修复之前,我意识到图像被上传了 10 多次,如果图像是离线创建的,甚至更多。

【问题讨论】:

  • 能否分享一下你正在阅读信息的代码?(片段)\
  • 池大小 = 2,活动线程 = 2,排队任务 = 128,已完成任务 = 0 似乎你已经开始了 130 个任务,2 个正在运行,没有一个完成。所以也许你的任务需要太多时间才能完成,你能展示一些 UploadTask 的代码吗?
  • 我添加了一个 EDIT 解释我如何解决这个问题。
  • 提供您的修复作为此问题的答案

标签: java android firebase firebase-realtime-database


【解决方案1】:

您可能正在使用有缺陷的 firebase 版本。在浪费了 4 个小时寻找解决方案并再次学习 Android 中的多线程之后!我的最终解决方案是降级到另一个版本。

对我来说,这个版本的依赖有效。

// Firebase
implementation 'com.google.firebase:firebase-core:16.0.8'
implementation 'com.google.firebase:firebase-database:16.1.0'

【讨论】:

  • 之前,你是用哪个版本得到这个异常的?
  • 我遇到了这个错误,我通过将依赖项升级到最新版本来修复它。 (提示:在 android studio 中有一个 firebase 工具可以自动为您添加依赖项。这些无法正常工作)
【解决方案2】:

我是如何解决这个问题的

出现此问题是因为图像被多次上传,因为一旦上传成功完成,我将我的宠物状态 isUploaded 更改为 true。但是,Firebase 需要几秒钟来进行更改,因此图像被上传了很多次。

我为解决此问题所做的工作可能不是解决它的最佳方法,但在我找到更好的方法之前它会起作用。我只是用一个数组来存储宠物id,上传完成后我跟踪宠物id知道图片已经上传,然后防止图片再次排队。

在修复之前,我意识到图像被上传了 10 多次,如果图像是离线创建的,甚至更多。

【讨论】:

    猜你喜欢
    • 2019-08-14
    • 2014-10-12
    • 1970-01-01
    • 2016-06-23
    • 1970-01-01
    • 2010-09-28
    • 2020-09-28
    • 2022-09-23
    • 1970-01-01
    相关资源
    最近更新 更多