【问题标题】:Is it common for Android View objects to manage background threads?Android View 对象管理后台线程是否常见?
【发布时间】:2013-12-18 22:19:10
【问题描述】:

我来自更多的 C++ 背景,我们可以使用析构函数优雅地停止后台操作(包括在必要时在 UI 组件中)。我正在开发一个小 android 端项目,我想在其中直观地呈现 wav 文件。我对使用任何库不感兴趣,这更像是一种练习。

我正在尝试创建一个 View 对象,该对象可以有效地获得一个 WavFile 对象(我自己设计的一个使用我编写的小型 RIFF 解析框架的对象)。这个 View 组件的目标是允许以不同的缩放级别渲染波形。

主视图对象 (WavView) 扩展了 Horizo​​ntalScrollView 并具有单个波形渲染器子级。这个想法是,随着缩放因子的增加,孩子可以水平变大,允许用户滚动缩放的波形。

随着缩放系数的增加,视图将减小它读取的样本的缩小范围,例如如果缩减范围为500,则缩减数据集中的每个样本为reduce[0] = average(source[0, 499])、reduce[1] = average(source[500, 999])等。缩减范围是根据 WavView 对象的宽度动态计算的,因此默认情况下缩放系数为 1,这意味着波形完全适合 WavView 内部(例如,没有滚动)。

这意味着每次缩放因子或父宽度发生变化时,我必须通读波形文件并根据缩小范围执行所有缩小。我为解析数据而设计的框架在回放该数据时也应该很有用。由于 wav PCM 样本是小端的,因此该框架将它们转换为大端,以便它也可以用于播放。

所有这些都不便宜,显然必须在单独的线程上完成。我希望能够将所有这些功能封装在同一类型中,从而将波形文件传递给它并进行渲染变得超级简单。在减少样本时,父级将显示进度指示器,完成后将显示渲染波形。

但是当我遇到可能设置另一个文件或活动被终止或只是从布局树中删除视图的情况时,我显然需要停止线程。这是android视图通常实现的东西吗?我应该以另一种方式这样做吗?我想尽可能多地保持封装。

编辑:AsyncTask 似乎对完成此任务很有用。

【问题讨论】:

    标签: android user-interface concurrency signal-processing


    【解决方案1】:

    这是android视图通常实现的东西吗?

    不,视图处理线程根本不是常见的做法。 Android 中的视图是 MVP 意义上的视图。他们应该能够使用传递给他们的数据非常快速地呈现自己,而不是真正“意识到”任何复杂的业务逻辑。正如您所说,将波形传递给视图可能没有意义,因为如果没有线程,解释波形会使系统陷入困境。

    编写一个可以获取波形并将其渲染到后台线程中的位图的演示器可能会更好地为您服务。您可以将其绑定到您的自定义视图,以便演示者将完成的位图发布到视图,它可以非常快速地渲染,但演示者始终致力于将下一个波形写入另一个线程中的不同位图。此演示者应绑定到 Activity 或 Fragment 生命周期,您必须处理诸如视图被移除、缩放或调整大小之类的事情。

    【讨论】:

    • 感谢您的回答。这实际上是我打算去的地方,处理文件的解析并绘制位图,因为在 onDraw 期间绘制几百点长的路径也不便宜。我没有意识到我没有提到那部分(已经有很多文字了)。我正在了解每个视图实例是否应该管理一个单独的加载绘图线程,但也许最好由单个作业队列来处理每个解析和绘制操作,而不是一次处理多个。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-09
    • 2012-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-01
    • 2011-03-04
    相关资源
    最近更新 更多