0

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

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

在我的情况下,使用线程和不确定进度对话框的最佳方法是什么?

我应该使用 asynctask 并在每次进行操作时调用它吗?使用简单的线程?我从未在视图中使用过任何线程

4

1 回答 1

1

你基本上有两个选择。很难判断哪个是最好的。

AsyncTask这里当然是一个选择。好的部分是它为您构建了与您的 UI 的同步。它将计算结果从doInBackground()(同时运行)传递到onPostExecute()(在 UI 线程上运行),以便您可以执行计算并安全地更新 UI。它还允许您通过publisProgress()/onProgressUpdate()方法对指示 UI 线程上的后台处理进度。

但是:AsyncTask 的行为在 API 1 和 API 17 之间发生了两次变化。根据设备运行的 Android 版本,默认情况下,多个 AsyncTask 可以并行运行或不并行运行。如果这对您很重要,您将不得不使用executeOnExecutor();此调用是为 API 11 引入的,这意味着如果您想在 11 之前支持 API,则必须处理反射。

您的第二个选择是有一个明确的 worker Thread。这种方法的吸引力在于您有一个专门的线程来处理您的应用程序中经常发生的任务并且需要在后台完成。但是,您必须自己处理所有 UI 同步问题。如果你有纪律,这并不难。如果您的 Thread 知道View需要修改的对象,它可以使用View.post(), View.postDelayed()etc 方法来调度引用视图并将在 UI 线程上执行的代码片段。

无论您选择哪种方法,您还面临两种影响。

  • Android 将以后台优先级运行你Thread和你AsyncTask的,如果它们是 CPU 密集型的,如果你不调整它,将导致十倍的执行时间。有关详细讨论,请参阅我对 AsyncTask 的回答,它必须承受这样的性能损失吗……?.

  • 您需要注意异步任务中的 View 引用。视图可能不再存在,因为用户按下后退或由于配置更改(例如设备旋转)而重新创建了您的活动。这意味着您经常为用户提供一种方法来启动许多线程,方法是非常快速地离开和重新进入您的活动,添加越来越多的线程来保存对不再可见的 View 对象的引用。如果你想变得聪明并且你的计算需要很长时间,你可能(这真的取决于)想要将你的线程重新附加到新的活动。如果您确保 Thread 以干净的方式结束并释放所有资源(如果您的 Activity 早已不复存在),则暂时忽略这一点是安全的。

于 2013-04-14T10:13:49.757 回答