Executor 上的 AsyncTask 和 PriorityBlockingQueue 实现问题

2024-01-05

在浪潮中这个问题 https://stackoverflow.com/questions/12039596/asynctask-on-executor-and-priorityblockingqueue并有许多提示另一个 https://stackoverflow.com/questions/7792767/priority-threadpoolexecutor-in-java-android,我正在尝试实现一个AsyncTask具有可以确定优先级的任务的变体。

In my CustomAsyncTask我的课程有:

public abstract class CustomAsyncTask<Params, Progress, Result> {

    private static int CORE_POOL_SIZE = 1;
    private static int MAXIMUM_POOL_SIZE = 1;

    private static final int KEEP_ALIVE = 1;

    private static final ThreadFactory sThreadFactory = new ThreadFactory() {
        private final AtomicInteger mCount = new AtomicInteger(1);

        public Thread newThread(Runnable r) {
            return new Thread(r, "CustomAsyncTask #" + mCount.getAndIncrement());
        }
    };

    private static final BlockingQueue<DownloadTask> pPoolWorkQueue =
            new PriorityBlockingQueue<DownloadTask>(10, new DownloadTasksComparator());

    @SuppressWarnings({ "unchecked", "rawtypes" })
    public static Executor PRIORITY_THREAD_POOL_EXECUTOR
            = new ThreadPoolExecutor(CORE_POOL_SIZE, MAXIMUM_POOL_SIZE, KEEP_ALIVE,
                    TimeUnit.SECONDS, (PriorityBlockingQueue) pPoolWorkQueue, sThreadFactory);

   //...
}

比较器:

public class DownloadTasksComparator implements Comparator<DownloadTask> {

    @Override
    public int compare(DownloadTask arg0, DownloadTask arg1) {
        int res;

        if (arg0 == null && arg1 == null) {
            res = 0;
        } else if (arg0 == null) {
            res = -1;
        } else if (arg1 == null) {
            res = 1;
        }

        res = arg0.getPriority() - arg1.getPriority();

        return res;
    }
}

In the DownloadTask类扩展CustomAsyncTask我有一个priority整数字段和getPriority() method.

我将任务执行称为:

DownloadTask dt = new DownloadTask(..., PRIORITY_NORMAL, ...);
dt.executeOnExecutor(CustomAsyncTask.PRIORITY_THREAD_POOL_EXECUTOR);

这是可行的:如果池大小为 1,则下载将被一项一项地执行;如果池大小为 2,等等。

注意:优先级整数具有任意值:

public static final int PRIORITY_HIGH = 10;
public static final int PRIORITY_NORMAL = 1;

但如果我将任务称为:

DownloadTask dt = new DownloadTask(..., PRIORITY_HIGH, ...);
dt.executeOnExecutor(CustomAsyncTask.PRIORITY_THREAD_POOL_EXECUTOR);

我有一个java.lang.ClassCastException: my.pkg.name.CustomAsyncTask$3 cannot be cast to my.pkg.name.DownloadTask

and then

at my.pkg.name.DownloadTasksComparator.compare(DownloadTasksComparator.java:1)
at java.util.concurrent.PriorityBlockingQueue.siftUpUsingComparator(PriorityBlockingQueue.java:334)
at java.util.concurrent.PriorityBlockingQueue.offer(PriorityBlockingQueue.java:447)
at java.util.concurrent.ThreadPoolExecutor.execute(ThreadPoolExecutor.java:1295)
at my.pkg.name.CustomAsyncTask.executeOnExecutor(CustomAsyncTask.java:494)
at my.pkg.name.GetDownloadTaskListener$1.finishDownload(GetDownloadTaskListener.java:180)
at my.pkg.name.DownloadTask.onPostExecute(DownloadTask.java:330)
at my.pkg.name.DownloadTask.onPostExecute(DownloadTask.java:1)
at my.pkg.name.CustomAsyncTask.finish(CustomAsyncTask.java:536)
at my.pkg.name.CustomAsyncTask.access$0(CustomAsyncTask.java:532)
at my.pkg.name.CustomAsyncTask$InternalHandler.handleMessage(CustomAsyncTask.java:549)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4745)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
at dalvik.system.NativeStart.main(Native Method)

全部来自AndroidRuntime

我真的没有任何线索...

EDIT:此时,我已经封装了一个小型 Eclipse 项目,该项目以与较大应用程序完全相同的方式实现事物,并且遇到了相同的问题。它借用CustomAsyncTaskComparator and CustomAsyncTask逐字。没有给出视觉反馈。应用程序的进度只是一些 LogCat 输出。但它给出了想法。当两个以上的任务排队时,应用程序 FC。

https://www.dropbox.com/s/lrg4kscgw3f1xwr/ConcurrentTest.tar.gz https://www.dropbox.com/s/lrg4kscgw3f1xwr/ConcurrentTest.tar.gz


CustomAsyncTask, like AsyncTask,使用static queue. 一切目前,该队列中的内容将贯穿您的DownloadTasksComparator。然而,DownloadTasksComparator仅适用于DownloadTask。只要你只使用DownloadTask,而不是其他子类CustomAsyncTask, 你会好起来的。但是,显然您还有其他一些匿名内部类扩展CustomAsyncTask,这不是一个DownloadTask.

Make CustomAsyncTask be abstract,有一个getPriority()方法作为abstract方法。改名DownloadTasksComparator to CustomAsyncTaskComparator并进行比较CustomAsyncTask实例。然后,你的其他子类CustomAsyncTask需要实施自己的getPriority()方法,使它们能够与DownloadTask工作队列中的实例。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Executor 上的 AsyncTask 和 PriorityBlockingQueue 实现问题 的相关文章

  • 如何从一个活动中完成一系列开放的子活动?

    我正在尝试为我的应用程序制作一个退出按钮 无论如何 我能够跟踪我的应用程序中的所有活动实例 然后完成它们 但在某些情况下 仍有一些活动仍然存在 不知道怎么办 有没有什么方法可以杀死android中的特定应用程序 或者我可以通过任何其他方式退
  • 添加动态数据时 footable 出现问题

    我需要 jQuery Mobile 方面的一些帮助富表 http css tricks com footable a jquery plugin for responsive data tables 我正在表中动态添加数据 HTML tab
  • Android向后兼容技术

    我现在在开发基于最新 API 15 ICS 的 15 项活动 Android 应用程序方面取得了进展 现在我发现应用程序的主要功能主义者即使支持 android v4 也不向后兼容 例如 1 fragment事务动画 2 将StringSe
  • 在代码中旋转按钮(或其中的文本)

    我必须通过编码随机旋转按钮 或里面的文本 它是相同的 API级别低于11是否有button setRotate x 好吧 看了一下 答案是 很复杂 您可以使用旧的动画框架旋转按钮 例如像这样 Button button Button fin
  • 导航组件参数默认值

    在导航组件中 将参数从第一个片段发送到第二个片段时 默认值不会从导航图中获取哪个集合 这是我的代码 导航图 xml
  • 维护 HttpUrlConnection 调用之间的会话(Native/Webview)

    让我从我做的开始desire 我想制作一个应用程序part native and part webviews Problem 维护本机和 webview 部分之间的会话 My 处理方法 this 我打算实现一个本机登录 其中我向用户展示两个
  • 从 BroadcastReceiver 获取方法来更新 UI

    我正在尝试根据变量的变化更新用户界面BroadcastReceiver 因此 我需要调用一个扩展类的方法 以获取我提到的变量 BroadcastReceiver in MainActivity取决于但我无法以任何方式获得真正的返回值 扩展的
  • 如何忽略 LeakCanary 中的某些类?

    有人能给我一个如何忽略 LeakCanary 中的某些类的有效示例吗 我正在查看这个示例 以忽略 LeakCanary 中第三方库中的某些类 但我不知道将其放在应用程序中的何处 我把它放在我的应用程序类中 但这些变量和方法有错误 isInA
  • 如何在 Android 应用程序中单击按钮时打开 Gmail Compose?

    当我的 Android 应用程序中单击按钮时 我尝试打开 Gmail 撰写屏幕 我需要 Google 提供的 API 密钥吗 或者我需要在按钮 onClickListener 中做什么 任何形式的见解都非常值得赞赏 正如 JeffC 指出的
  • 在浏览器中打开 URL,即使我的应用程序为其注册了意图过滤器

    我的应用程序为某些 URL 注册了一个意图过滤器 因为它可以处理来自这些 URL 的数据 但是 在应用程序内部 我想提供一个按钮来在浏览器中打开这样的 URL 也就是说 如果设置了默认浏览器 则在默认浏览器中打开它 否则提供一个选择器 就像
  • 并行化斐波那契序列生成器

    我正在学习并行化 在一项练习中 我得到了一些我应该提高性能的算法 其中之一是斐波那契数列生成器 array 0 0 array 1 1 for q 2 q lt MAX q array q array q 1 array q 2 我怀疑 这
  • 收到“无法解析上传的APK的AndroidManifest.xml。它是否正确编译?”启用 Google 应用签名后出现错误

    启用后谷歌应用程序签名 https support google com googleplay android developer answer 7384423 hl en 每次我尝试将签名版本 APK 上传到 Play 商店时 都会收到一
  • 如何知道用户是否在 Android 应用程序中输入了错误的密码(锁定屏幕)

    我正在开发一个 Android 应用程序 如果用户在 Android 锁定屏幕中输入错误的密码 则必须完成其中一项活动 例如 如果用户输入错误的密码 则会发送电子邮件 我将不胜感激任何帮助 提前致谢 Kshitij 锁屏在完全沙箱环境中运行
  • Android Drawable 绘图性能?

    在我看来 我有一个简单的 ARGB 可绘制对象 大约需要 2 毫秒才能绘制 但我可以在 0 5 毫秒内绘制与位图相同的文件 只是一些快速代码 我真的不能认为它是一个选项 优化可绘制对象的绘制速度的最佳方法是什么 这取决于可绘制的数量以及每个
  • 截图显示黑色

    我正在拍摄快照并创建缩略图 然后共享此图像 但缩略图显示全黑 我使用了以下代码 Bitmap bitmap View v1 v getRootView v1 setDrawingCacheEnabled true bitmap Bitmap
  • 如何更改 Android 12 启动屏幕中的图标形状?

    我想要矩形形状的启动屏幕图标 而不是 android 12 中的圆形形状 我不相信你可以 如果你看这里的第 3 点 https developer android com about versions 12 features splash
  • 将 Crashlytics 集成到图书馆项目

    我有一个图书馆项目 自定义视图库项目 它没有任何活动 服务 我想将 Crashlytics SDK 集成到我的库中 当我尝试通过 Android Studio 的 Crashlytics 插件 工具栏中的图标 添加它时 它只是停留在 Che
  • 动态创建 JSON 对象

    我正在尝试使用以下格式创建 JSON 对象 tableID 1 price 53 payment cash quantity 3 products ID 1 quantity 1 ID 3 quantity 2 我知道如何使用 JSONOb
  • 改造方法调用可能会产生“java.lang.NullPointerException”

    使用 Retrofit 2 3 0 我在 Android Studio 中收到以下消息 有关如何删除此 IDE 错误消息的任何建议 谢谢 来自Response文档 http square github io retrofit 2 x ret
  • 在android中使用BaseActivity的不同活动中的通用标头

    我想编写一次代码并在不同的活动中使用 我创建了一个Base Activity class为了那个原因 此外 不同活动中所有布局的标题都是相同的 我在以下人员的帮助下做到了这一点

随机推荐

  • 如何以编程方式更改 Android 谷歌地图 v2 中的语言

    我有一个应用程序 您可以在其中更改设置中的区域设置 目的是能够在应用程序内拥有与系统区域设置不同的区域设置 我也希望能够设置地图的语言 我只能找到 设置手机的系统语言 之类的答案 这不是我要找的 有没有办法以编程方式或从 xml 设置地图的
  • Matlab聚类编码-绘制散点图

    我有一年期间每日 每年的能源消耗数据集 我想显示该数据集的散点图 分为我期望存在的四个集群 由于四个季节的差异 我知道 matlab cluster 函数可以做到这一点 但我的统计数据非常生疏 我希望得到一些指导来确定哪个函数最好使用 Th
  • 如何在 Mac 版“Visual Studio Code”中取消链接/从 Git 存储库注销

    一直在玩这个微软编辑器 相当不错 但缺少一些最基本的 UI 位 不知道如何从我之前登录的 Git 存储库中取消链接 注销 退出并重新打开该软件不起作用 而且 没用说 我有很多我使用的存储库 任何想法 在侧面板的底部 有一个帐户图标 通常位于
  • 简单的CSS固定标题

    使以下页眉成为固定页眉的最简单方法是什么 http presentationtube com header php http presentationtube com header php我应该移动标题中的菜单元素吗 templatemo
  • 根位于 arr[0] 的二叉堆有什么好处

    我正在数组上写一个二进制堆arr 除叶节点外 每个节点都有两个子节点 根可以位于arr 0 or arr 1 接受的答案在为什么在数组实现的堆中索引 0 未被使用 https stackoverflow com questions 2290
  • TFS 到 TFS 迁移工具 - 域问题

    第三方为我们开发了一些应用程序 并一直使用 MS Team Foundation Server 2008 进行源代码控制 我的公司最近设置了 TFS 2008 环境 我们正在尝试将源代码从第 3 方开发人员 TFS 迁移到我们的 TFS 机
  • SQL 不断收到 ON UPDATE CASCADE 错误

    大家好 我正在使用这个 ON UPDATE CASCADE 功能 但我仍然无法让它工作 我的第一张桌子 CREATE TABLE Stab Stab id int not null Sprache VARCHAR2 2000 Vorname
  • Swift 保留周期和闭包

    我尝试做很多研究来理解保留周期 但我似乎在我的例子中找不到任何东西 我确实知道 如果我将属性设置为闭包 则会发生保留周期 并且需要使用弱或无主 但我有两个例子 我想知道它们是否正确完成 提前致谢 我已经尝试查看它们是否已经在 stackov
  • jest.toHaveBeenCalledWith 中松散匹配一个值

    我有一个分析跟踪器 它只会在 1 秒后调用 并且带有一个对象 其中intervalInMilliseconds 持续时间 值为not确定性的 我该如何使用jest toHaveBeenCalledWith测试对象 test pageStat
  • 有没有办法在非模板类中定义模板成员?

    假设我有一个名为的类模板Compute 和另一个名为Function A使用成员函数模板 template
  • Laravel 4 - 显示带有旧数据输入以及数据库信息的编辑表单

    我正在为我的应用程序制作一个编辑表单 我想知道是否有人可以告诉我如何将数据库中的数据获取到我的文本字段中 我可以根据用户的点击找到我需要编辑的记录 如果我执行以下操作 我可以显示信息 value letter gt subject 但是 我
  • C# WPF 即使在最小化时也捕获 keydown

    我想知道如何让我的应用程序捕获任何 keydown keyup 即使应用程序表单最小化也是如此 假设程序最小化 然后用户按 A 将出现一个弹出控件 请注意 我的程序可以运行 但在最小化时不能运行 谢谢 你需要的是HotKeys 没有内置的
  • 从父框架中的 iframe 打开锚标记

    给定以下 HTML iframe 中的锚标记是否可以定位父窗口 div div iframe pageview html 内容 a href http www google com link a 你想要的target属性 https dev
  • 移动应用商店分析选项(Apple、Android、OVI 等)? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 有人有移动应用商店分析软件 服务的经验吗 我目前只为 iOS 开发 所以这是我主要感兴趣的 但是我想知道
  • 在 Feign 客户端中使用 spring 表单编码器时,请求正文未正确编码和隐藏

    我已经为 spring open feign 添加了必要的依赖项 如中提到的https github com OpenFeign feign form https github com OpenFeign feign form并遵循上述 f
  • 如何在两个表格之间添加垂直线?

    这是标记 我想在两个表格之间添加一条垂直线 我不想在这里使用图像 我需要一个纯 html 解决方案 div table width 50 tr td p class dotted row 1 cell 1 p td td p class d
  • PgAdmin 的 Kubernetes 持久卷挂载

    我正在尝试为我的 pgadmin 部署创建持久卷声明 以便在每次从 CD 管道部署后推出更新时可以保留我的设置 服务器等 在我的日志中 我收到以下错误 2020 10 05 00 54 56 0000 91 INFO Worker exit
  • Angular2:如何向应用程序注入没有装饰器的服务?

    当尝试使用时Http在 App 组件 我们正在引导的组件 中一切正常 找到 export default class AppComponent constructor public http Http console log this ht
  • 删除 MagicalRecord 中的实体不会持久

    我在使用 MagicalRecord 时遇到了一个奇怪的问题 删除不会持久 当我删除时 NSFetchedResultsControllerDelegate 正确地看到该对象已被删除 但是 如果我关闭并重新打开应用程序 该实体就会重新出现
  • Executor 上的 AsyncTask 和 PriorityBlockingQueue 实现问题

    在浪潮中这个问题 https stackoverflow com questions 12039596 asynctask on executor and priorityblockingqueue并有许多提示另一个 https stack