我有一个自定义视图,我可以在上面绘制不同大小的文字和图像。因为我需要对不同的用户操作执行各种计算,并且它们可以持续3-4秒,所以我需要实现一种在用户等待时显示进度对话框的方法。
场景是这样的:例如,用户添加了一些文本和图像,我需要调整它们的大小,直到它们适合可用的视图空间。这都是在我的自定义视图的一个方法上完成的。
在我的例子中,使用线程和不确定进度对话框的最佳方式是什么?
我是否应该使用异步任务,并在每次执行操作时调用它?使用简单的线程?我从未在视图中使用过任何线程
发布于 2013-04-14 18:13:50
你基本上有两个选择。判断哪一个是最好的并不容易。
在这里,AsyncTask当然是一个选择。好的部分是它为你的UI构造了同步。它将计算结果从doInBackground() (并发运行)传递到onPostExecute() (在UI线程上运行),因此您可以安全地执行计算和更新UI。它还允许您通过publisProgress() / onProgressUpdate()方法对指示UI线程上的后台处理进度。
但是:在API1和API17之间,AsyncTask的行为发生了两次变化。根据设备运行的安卓版本,默认情况下,几个AsyncTasks可以并行运行,也可以不并行运行。如果这对你很重要,你将不得不使用executeOnExecutor();这个调用是为API11引入的,这意味着如果你想支持11之前的API,你必须处理反射。
您的第二个选择是拥有一个显式的worker Thread。这种方法的吸引力在于,对于经常出现在应用程序中并需要在后台完成的任务,您有一个专用的线程。但是,您必须自己处理所有的UI同步问题。如果你训练有素,这并不难。如果您的线程知道需要修改的View对象,它可以使用View.post()、View.postDelayed()等方法来调度引用视图的代码片段,这些代码片段将在UI线程上执行。
无论您选择哪种方法,您都会面临两个额外的影响。
Thread和AsyncTask,如果它们是CPU密集型的,如果你不调整它,将导致十倍的执行时间。有关详细讨论,请参见my answer to AsyncTask, must it take such a performance penalty hit…?.https://stackoverflow.com/questions/15997257
复制相似问题