首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Android中带有线程的自定义视图和进度对话框

Android中带有线程的自定义视图和进度对话框
EN

Stack Overflow用户
提问于 2013-04-14 16:45:59
回答 1查看 267关注 0票数 0

我有一个自定义视图,我可以在上面绘制不同大小的文字和图像。因为我需要对不同的用户操作执行各种计算,并且它们可以持续3-4秒,所以我需要实现一种在用户等待时显示进度对话框的方法。

场景是这样的:例如,用户添加了一些文本和图像,我需要调整它们的大小,直到它们适合可用的视图空间。这都是在我的自定义视图的一个方法上完成的。

在我的例子中,使用线程和不确定进度对话框的最佳方式是什么?

我是否应该使用异步任务,并在每次执行操作时调用它?使用简单的线程?我从未在视图中使用过任何线程

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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线程上执行。

无论您选择哪种方法,您都会面临两个额外的影响。

  • Android将以后台优先级运行你的ThreadAsyncTask,如果它们是CPU密集型的,如果你不调整它,将导致十倍的执行时间。有关详细讨论,请参见my answer to AsyncTask, must it take such a performance penalty hit…?.
  • You需要注意异步任务中的视图引用。视图可能不再存在,因为用户按下了Back,或者由于配置更改而重新创建了您的活动,例如设备旋转。这意味着你经常给用户一种方法来启动你的许多线程,通过非常快速地离开和重新进入你的活动,添加越来越多的线程,这些线程持有对不再可见的View对象的引用。如果你想变得更聪明,并且你的计算需要很长时间,你可能(这真的取决于)想要将你的线程重新附加到新的活动上。如果你确保线程以一种干净的方式结束,并释放所有资源,如果你的活动很久没有了,那么暂时忽略它是安全的。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15997257

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档