【发布时间】:2013-12-18 22:19:10
【问题描述】:
我来自更多的 C++ 背景,我们可以使用析构函数优雅地停止后台操作(包括在必要时在 UI 组件中)。我正在开发一个小 android 端项目,我想在其中直观地呈现 wav 文件。我对使用任何库不感兴趣,这更像是一种练习。
我正在尝试创建一个 View 对象,该对象可以有效地获得一个 WavFile 对象(我自己设计的一个使用我编写的小型 RIFF 解析框架的对象)。这个 View 组件的目标是允许以不同的缩放级别渲染波形。
主视图对象 (WavView) 扩展了 HorizontalScrollView 并具有单个波形渲染器子级。这个想法是,随着缩放因子的增加,孩子可以水平变大,允许用户滚动缩放的波形。
随着缩放系数的增加,视图将减小它读取的样本的缩小范围,例如如果缩减范围为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