1

我有一个按钮,当用户单击它时,它将更新整个 UI(文本视图、图形)。UI 的内容来自一个 SQLite 数据库,我将更新函数命名为 loading()。您可以想象,在 loading() 内部,有很多数据库操作和 UI 更新。当数据变大时,这个loading()完成的时间会变长,所以按钮会保持在按下状态的时间会更长。

我尝试使用asynctask来处理这种情况,以便出现progressdialog 而不是冻结按钮,但是我无法将loading() 方法放在asynctask 的doinbackground() 上,因为doinbackground() 无法触及声明的UI 组件来自其活动的 onCreate() 方法。

我不想重写 loading() 函数。

还有什么办法可以吗??请帮忙,如果可以的话,请提供一些例子,我很感激。

4

5 回答 5

3

如果您在主应用程序线程(也称为 UI 线程)上运行耗时任务,您将有无响应的 UI 并最终看到著名的应用程序无响应 (ANR) 对话框

推荐的方法是在 AsyncTask 中执行这些操作并publishProgress()调用doInBackground(). 将您的 UI 更新逻辑放入onProgressUpdate()您的AsyncTask. onProgressUpdate()调用后将在主应用程序线程上自动调用publishProgress().

于 2012-10-02T15:33:28.997 回答
1

为了在此实例中使用 AsyncTask,您需要在 doInBackGround() 中加载数据并使用结果填充某种数据结构或模型对象。然后将其作为 doInBackground() 的结果返回。

onPostExecute()确实在 UI 线程上运行,并且可以使用结果来填充和更新您的组件。

于 2012-10-02T15:33:39.037 回答
1

我认为最好的选择是使用 AsyncTask 来完成这项工作。您可以在需要时从 loadInBackground 触发进度更新以获取一些 UI 更新(publishProgress()从任务后台线程调用,该方法onProgressUpdate()将在 UI 线程上调用)。

其他选项:在单独的线程或后台服务中完成工作。然后在您的 UI 中,您可以使用 Handler 每 X 毫秒触发一次刷新。

于 2012-10-02T15:35:10.723 回答
-1

您可以使用runOnUiThread(Runnable). 您还可以使用Thread和的组合Handler

于 2012-10-02T15:31:05.753 回答
-2

我目前正在学习Handlers 并且根据文档,它们是当前推荐的访问数据的方式,因为一方面,它们为您执行异步加载。正如您所说,您无法从 UI 线程以外的其他线程访问 UI 组件。这意味着无论您是使用Handler代码还是滚动您自己的代码AsyncTask,都需要将更新 UI 的代码与加载数据的代码分开。

于 2012-10-02T15:35:16.557 回答