我来自更多的C++背景,我们拥有豪华的析构函数来优雅地停止后台操作(包括必要时在UI组件中)。我正在研究一个我想在视觉上呈现wav文件的小型android端项目。我对使用任何库都不感兴趣,这比其他任何工作都更重要。Android View对象管理后台线程常见吗?
我正在尝试创建一个View对象,可以有效地给出一个WavFile对象(我自己设计了一个使用我写的小型RIFF分析框架的对象)。这个View组件的目标是允许在不同的缩放级别上渲染波形。
主视图对象(WavView)扩展了HorizontalScrollView并具有单个波形呈现器子级。这个想法是,随着缩放系数的增加,孩子可以水平变大,允许用户滚动缩放波形。
随着缩放系数的增加,视图将减小它读取的样本的缩小范围,例如,如果减小范围是500,则减少的数据集中的每个样本减少[0] =平均(源[0,499]),减少[1] =平均(源[500,999])等。减小范围是基于WavView对象的宽度动态计算的,因此默认情况下缩放因子为1,这意味着波形完全适合WavView(例如不滚动)。
这意味着每次缩放因子或父宽度改变时,我都必须读取波形文件并根据缩小范围执行所有缩小操作。我为解析数据而设计的框架在播放数据时也应该很有用。由于wav PCM样本是小端,所以这个框架将它们转换成大端,这样它也可以用于回放。
所有这些都不便宜,显然必须在单独的线程上完成。我希望能够将所有这些功能封装在同一类型中,使得将波形文件传递给它并进行渲染变得非常简单。在缩小样本的同时,父母会显示进度指示器,完成时会显示呈现的波形。
但是,当我遇到可能是另一个文件正在设置或活动被杀死的情况下,或者只是从布局树中删除视图,我显然需要停止线程。这是Android视图通常实现的东西吗?我应该以另一种方式做这个吗?我想保持尽可能多的封装。
编辑:AsyncTask似乎是可能对实现这一目标有用的东西。
感谢您的回答。这实际上就是我打算去的地方,处理文件的解析和绘制位图,因为在onDraw期间绘制数百个点的路径也不会便宜。我没有意识到我没有提到那部分(已经有太多的文字了)。我想知道每个视图实例是否应该管理一个单独的加载绘制线程,但是对于单个作业队列来说,处理每个解析和绘制操作可能更好,而不是一次处理多个。 –