从自定义视图启动 AsyncTask 的最佳实践

2023-12-29

产生耗时的计算线程是很常见的。稍后我们需要更新Activity or Fragment与计算结果。

我一直遵循以下准则。到目前为止,它对我来说效果很好。

AsyncTask需要onPostExecute UI Fragment

  1. Use setRetainInstance(true)无 UI 片段。
  2. Use setTargetFragment and getTargetFragment技术
  3. 请参阅https://stackoverflow.com/a/12303649/72437 https://stackoverflow.com/a/12303649/72437

AsyncTask需要onPostExecute UI Activity

  1. Use setRetainInstance(true)无 UI 片段。
  2. Use onAttach and onDetach存储参考Activity。 Google 似乎不鼓励使用getActivity. http://developer.android.com/guide/components/fragments.html http://developer.android.com/guide/components/fragments.html
  3. 请参阅https://stackoverflow.com/a/16305029/72437 https://stackoverflow.com/a/16305029/72437

但是,派生自的类的情况如何?View?我计划推出AsyncTask从习俗View。然而,我怎样才能onPostExecute回到View?

我这么问的原因是,在我的自定义视图中,某些触摸事件将触发它使用新的位图重新绘制自身。生成新位图非常耗时。因此,我计划启动一个 AsyncTask,来生成这样的位图,然后传递回自定义视图。但是,配置更改可能会导致重新创建自定义视图。因此,我需要确保我的 AsyncTask 在执行期间可以有正确的视图引用onPostExecute.


假设您正在使用AsyncTask仅适用于与绘图相关的操作(否则您应该真正重新审视您的逻辑 - 正如评论所建议的那样),您可以创建AsyncTask直接在您的自定义中View class:

class MyView extends View {

    private MyAsyncTask currentTask = null;

    // View details

    @Override
    public void onAttachedToWindow() {
        currentTask = new MyAsyncTask(this);
        currentTask.execute();
    }

    @Override
    public void onDetachedFromWindow() {
        super.onDetachedFromWindow();
        if (currentTask != null) {
            currentTask.cancel(true);
            currentTask = null;
        }
    }

    static class MyAsyncTask extends AsyncTask<Void, Void, Bitmap> {

        private WeakReference<MyView> viewRef;

        MyAsyncTask(MyView view) {
            viewRef = new WeakReference<>(view);
        }

        // background task implementation

        @Override
        public void onPostExecute(Bitmap bitmap) {
            MyView view = viewRef.get();
            if (view == null) {
                return;
            }

            // you now can safely update your view - we're on UI thread
        }

    }

}

这就是安全实施的样子。它有一些缺点和重要部分:

  • 在任何时候你的AsyncTask应该强烈引用View(这就是为什么类被声明为static并持有WeakReference to View)
  • 当你对结果不感兴趣时AsyncTask不再 - 取消它
  • 此实现只会丢弃取消的可能有用的结果AsyncTask。如果这是问题所在 - 我建议删除AsyncTask from View完全并寻找其他解决方案(单独Executor or HandlerThread).

Also onPostExecute of AsyncTask将从启动它的同一个循环线程中调用(在您的情况下,这是主线程,所以如果您从Activity or View,或其他任何地方,这完全取决于管理这些任务的难度)。

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

从自定义视图启动 AsyncTask 的最佳实践 的相关文章

  • 设置 CollapsingToolbarLayout 的起始高度

    我希望能够在 CollapsingToolbarLayout 内的 ImageView 上滚动 那么这怎么可能 以及如何设置该图像视图的起始高度 我的 ImageView 高度是 280p 在活动开始时我想显示 200p 然后我可以向下滚动
  • 移动网站 Facebook 使用 Facebook App 登录以获取登录详细信息

    使用网络浏览器 例如Android 上的 Chrome 如果移动网站要求用户登录 Facebook 而用户没有登录 则即使手机可能通过 Facebook 本机应用程序登录 Facebook 浏览器也会要求用户提供登录详细信息 有没有什么方法
  • Android ImageButton 在 Activity 中运行良好。它在片段中不起作用

    我正在尝试转换布局 使其包含片段 其中一个视图是具有侦听器的 ImageButton 该代码作为 Activity 运行良好 但作为 Fragment 会出现麻烦 第一个问题是我无法使用 findViewById 但我能够在这里找到答案并使
  • 将 APK 移动到 /system/priv-app/ 时出现 java.lang.UnsatisfiedLinkError

    成功调试我的应用程序后 我想将应用程序移动到系统应用程序 以便我可以使用系统权限 例如 REBOOT 和 SET TIME 但是 当将我的 APK 移动到 system priv app 文件夹或将 APK 添加到 ROM 编译中的第三方系
  • 错误:java.lang.NoClassDefFoundError Android

    我正在关注这个创建滑动选项卡的教程 http www truiton com 2015 06 android tabs example fragments viewpager 但我收到上述错误 我的 gradle 依赖结构 dependen
  • OneSignal 推送通知 单击以打开活动

    我集成了一个用于推送通知的信号库 我想在应用程序未运行时通过单击推送通知来打开特定活动 我收到推送通知 但当我单击通知时 应用程序崩溃了 这是我的通知接收器代码 public class ExampleNotificationOpenedH
  • android 中 y + 高度必须 <= bitmap.height()

    我想从另一个创建位图 但每次尝试都会崩溃 这是错误消息 java lang IllegalArgumentException y 高度必须 这是我尝试创作的地方 public void saveBitmap Bitmap bitmapToS
  • 加载内容时在 ImageView 中使用“动画圆圈”

    我目前在我的应用程序中使用一个列表视图 可能需要一秒钟才能显示 我目前所做的是使用列表视图的 id android empty 属性来创建 正在加载 文本
  • Android - 如何获取文本视图中字符的坐标

    是否可以从 Android 中的 TextView 中的字符获取 x 坐标 我不是在寻找 TextView 本身的坐标 我需要 TextView 中最后一个字符的坐标 多行 提前致谢 Java解决方案 以下是如何获得x and y特定字符的
  • Android:对于具有 LinearLayout 定义的成员的 ListView,上下文菜单不显示?

    我有一个 ListActivity 和 ListView 并且我已将一些数据绑定到它 数据显示得很好 而且我还为视图注册了一个上下文菜单 当我将列表项显示为简单的 TextView 时 它工作正常
  • 检查从 arrayadapter 获取的复选框

    我有标题清单 CheckBox 我想控制默认检查哪一个 所以我试图获得正确的视图并检查它 但由于某种原因它不起作用 知道为什么吗 form checkbox item xml
  • 在路径上找不到类:DexPathList?

    当我在 android studio 中使用 USB 在真实设备中测试时 我的应用程序工作正常 但是当我将 apk 发送到另一台设备并在那里安装时 它无法工作 应用程序崩溃了 我没有找到任何正确的方法来解决问题 错误如下 FATAL EXC
  • Gradle 构建无法解析生成的类

    我刚刚将 Android Studio 从 1 5 更新到 2 2 1 Gradle 也是如此 我有一个项目 它使用注释处理器框架 由我制作 来执行类似 Dagger 的依赖注入 这在更新之前工作得很好 但现在 Gradle 无法解析生成的
  • JaCoCo 显示 0% 覆盖率,即使所有测试均已通过

    我在下面写了一些测试用例androidTest目录 我正在使用 androidx testInstrumentationRunner androidx test runner AndroidJUnitRunner 添加的依赖项 androi
  • Android jUnit 测试 java.lang.NoClassDefFoundError: android/database/sqlite/SQLiteOpenHelper

    我正在尝试运行一个模拟子类的单元测试SQLiteOpenHelper但我收到以下错误 java lang NoClassDefFoundError android database sqlite SQLiteOpenHelper at ja
  • Facebook 好友请求 - 失踪好友

    我请求从我正在开发的 Android 应用程序中获取用户好友 从 Facebook Api V2 0 开始 我知道我应该只获取已经通过我的应用程序登录的用户好友 但是 尽管我知道用户的某些朋友已通过我的应用程序登录 但在请求该用户的朋友时
  • Android - 带动画的可扩展 TextView

    我有一个TextView首先显示长文本的一小部分 用户可以按 查看更多 按钮来展开TextView并查看该文本的其余部分 进行测试 我可以通过简单地交换以下值来实现这一点TextView setMaxLines介于 4 之间 用于折叠 和
  • 从前台服务的活动中释放内存

    我有一个带有前台服务和一项活动的应用程序 该服务可以在启动时自行启动 也可以从 Activity 中启动 我注意到当服务在启动时自行启动时 内存使用量约为 3MB 一旦我打开该 Activity 内存使用量就会跃升至约 9mB 一旦 Act
  • 安卓浮动键盘

    是否可以通过编程方式更改键盘的位置 我正在开发一个图腾应用程序 如果键盘停靠在底部 则很难使用 我尝试创建一个扩展 InputMethodService 的自定义键盘 并且我能够更改按键的布局 但我无法更改键盘的视图位置 快捷键 https
  • 找不到R类

    当我打开 Eclipse 时 R class在我的项目中消失了 为什么 我有 eclipse juno 和最新版本的 android SDK The R class不会重新生成 因为代码中有错误 我怎么解决这个问题 Try Project

随机推荐

  • 如何取消对 Excel 工作簿的保护

    我有一个受密码保护的 Excel 工作簿 整个文档 而不仅仅是一个工作表或一组工作表 如果没有密码 您将无法打开该文件 我知道密码 所以我能够打开它 但没有明显的方法来关闭密码保护 具体来说 我想在 VBA 中执行此操作 因为最终我希望能够
  • 存储我的应用程序特定数据的正确位置在哪里?

    我正在开发一个小型 C Winforms 游戏 我想要做的事情之一是保存应用程序特定的数据 然而 我有点难以理解应该存储的正确位置 据我所知 应用程序可能存储多种类型的数据 因此保存数据的位置也不同 1 应用属性 设置 例如应用程序存储数据
  • 使用 cypress 选择下拉列表项

    我需要使用 cypress 测试 angularjs 应用程序的下拉菜单 我需要单击下拉列表 然后从下拉列表中选择或单击一个项目 我尝试如下 它适用于一个实例 但不适用于其他时间 因为第二个 get 方法中的 id 号在动态生成时不断变化
  • 评级问题

    我在使用 jquery ui 单选按钮集创建评级代码时遇到问题 它将集成到内容管理中 因此我不想使用 ID 并限制编码限制 我已经使用数组完成了 90 的工作 但是当我从下到上选择时 它无法正常工作 任何人都可以帮忙解决这个问题吗 谢谢
  • 如何在 Silverlight 4 应用程序中获取 Outlook 2003 数据

    是否可以将 Outlook 2003 自动化与 Silverlight 4 结合使用 或者也许有一些不同的方法可以在 Silverlight 应用程序中使用 Outlook 2003 MAPI 我正在使用 Silverlight 4 并尝试
  • Bootstrap模式弹出确认防止多次点击

    button name remove levels on click function e var form this closest form e preventDefault confirm modal backdrop static
  • 从 Python 脚本子进程获取输出

    这可能是一个愚蠢的问题 但我有一个启动子进程的 Python 脚本 也是一个 Python 脚本 并且我需要该子进程返回三个整数 如何从启动子进程的 Python 脚本获取这些返回值 我是否必须将整数输出到标准输出 然后使用 check o
  • SharedPreferences.onSharedPreferenceChangeListener 未被一致调用

    我正在注册一个像这样的首选项更改侦听器 在onCreate 我的主要活动 SharedPreferences prefs PreferenceManager getDefaultSharedPreferences this prefs re
  • 适用于 Android 的 Google Play 音乐 API

    我正在开发一款 Android 音乐应用程序 我需要两件事 获取艺术家的专辑封面 专辑名称 曲目名称等 打开 Google Play 页面购买这张专辑 首先我目前正在使用iTunes API http www apple com itune
  • 如何操作 jqGrid 的搜索/过滤器?

    我有一个带有导航栏的 jqGridsearch true and multipleSearch true 我想在我的 UI 中添加一个按钮 自动向搜索添加附加规则 我尝试直接操作过滤器的 postData 但以这种方式添加的值不会显示在搜索
  • Java VS C# 中的 intBitsToFloat 方法?

    在 C 中将位转换为浮点数时 我得到了错误的数字 让我们使用这个位number 1065324597 In Java 如果我想从位转换为浮点数 我会使用intBitsToFloat method int intbits 1065324597
  • 在 BigQuery 中安排查询

    我有一个 BigQuery 查询 它将两个表联合起来 每日 Google Analytics 导出 我想要的是将查询保存为视图或表 但随着新的 Google Analytics 数据加载到 BigQuery 中 最终视图 表每天会自动更新
  • 如何使用 FileProvider 共享任意路径的文件?

    我的应用程序允许用户下载一些内容并将其存储在他选择的文件夹中 我想创建一个 ContentProvider 来共享这些文件 但当下载的文件存储在应用程序默认路径之外时 我不知道该怎么做 我试图声明以下文件路径
  • 所有 gms/firebase 库必须使用完全相同的版本规范 Android Studio

    我知道这个问题已经被问过很多次了 但我无法弄清楚 让我解释一下 5 月 2 日 Firebase 宣布 Firebase Android SDK 现在拥有独立的版本号 检查这里 Firebase Android 发行说明 https fir
  • .NET webservice - 快速确认,但继续在后台处理

    我正在构建一个将由供应商的应用程序使用的 NET Web 服务 但我不确定如何完成以下任务 供应商将致电我的网络服务并提供一些信息 但希望快速返回确认信息 仅说明我收到了他们的信息 他们不关心我用它做什么 也不想确认我已经完成处理 我传递的
  • 重新排序数组

    比如说 我有一个如下所示的数组 var playlist artist Herbie Hancock title Thrust artist Lalo Schifrin title Shifting Gears artist Faze O
  • 将 Bladejs 与 Meteor 结合使用

    我最近将节点刀片智能包添加到我的流星中 并且静态内容显示良好 但是 我无法使用任何模板变量 在我安装 Blade 之前 模板变量与车把配合得很好 有人知道我做错了什么吗 控制台输出 ReferenceError player is not
  • 是否可以将 MKS Integrity 存储库导入 git 中?

    我只需要源树及其历史记录 我现在不关心需求 问题 我用命令行玩了一下 看看是否可以获得主干和一些开发路径的更改包列表 我认为应该可以为每个更改包提取差异 并使用它来重放自 git 中第一次提交以来的所有更改 像这样的东西 获取第一个提交并将
  • !clrstack -p 不给出调用堆栈中方法的参数值

    我们正在尝试使用 Windbg 分析 w3wp 内存转储 我们发现 w3wp 进程由于堆栈溢出而崩溃 我加载了 psscor4 dll 并通过发出 clrstack 获取了调用堆栈 但我也想知道传递给方法的参数 如果我发出 clrstack
  • 从自定义视图启动 AsyncTask 的最佳实践

    产生耗时的计算线程是很常见的 稍后我们需要更新Activity or Fragment与计算结果 我一直遵循以下准则 到目前为止 它对我来说效果很好 AsyncTask需要onPostExecute UI Fragment Use setR