Android View 对象管理后台线程是否常见?



我来自更C++的背景,我们可以奢侈地使用析构函数来优雅地停止后台操作(包括在必要时在 UI 组件中)。 我正在做一个小的安卓项目,我想在其中直观地渲染 wav 文件。 我对使用任何库来做到这一点不感兴趣,这比其他任何事情都更像是一种练习。

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

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

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

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

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

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

编辑:AsyncTask似乎可能对完成此操作有用。

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

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

编写一个演示器

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

最新更新