2013-12-18 17 views
0

我来自更多的C++背景,我们拥有豪华的析构函数来优雅地停止后台操作(包括必要时在UI组件中)。我正在研究一个我想在视觉上呈现wav文件的小型android端项目。我对使用任何库都不感兴趣,这比其他任何工作都更重要。Android View对象管理后台线程常见吗?

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

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

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

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

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

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

编辑:AsyncTask似乎是可能对实现这一目标有用的东西。

回答

1

这是android视图常用的东西吗?

不,对于视图来说,处理线程是不常见的做法。 Android中的视图是MVP意义上的视图。他们应该能够很快地将数据呈现给他们,而不是真正意识到任何复杂的业务逻辑。如您所述,将波形传递到视图可能没有意义,因为如果没有线程,解释波形会导致系统崩溃。

通过编写一个可以获取波形并在后台线程中将其呈现为位图的演示者,您可能会更好地服务于此。你可以用这种方式将你的自定义视图绑定到你的自定义视图上,使得演示者将完成的位图发布到视图上,该视图可以非常快地渲染,但演示者总是在将另一个波形写入另一个线程中的不同位图。这个演示者应该绑定到一个Activity或Fragment的生命周期,并且你必须处理诸如被删除,缩放或调整大小的视图。

+0

感谢您的回答。这实际上就是我打算去的地方,处理文件的解析和绘制位图,因为在onDraw期间绘制数百个点的路径也不会便宜。我没有意识到我没有提到那部分(已经有太多的文字了)。我想知道每个视图实例是否应该管理一个单独的加载绘制线程,但是对于单个作业队列来说,处理每个解析和绘制操作可能更好,而不是一次处理多个。 –