2013-04-24 48 views
0

我用AsyncTask来请求一大块数据。收到数据后,将在onPostExecute方法内处理数据。处理数据可能需要一段时间。活动的用户界面冻结在AsyncTask的onPostExecute?

根据我的理解,AsyncTask是异步的,并且独立于UI。

  • 为什么我的活动冻结onPostExecute
  • 如果onPostExecute方法内的处理过长,Activity冻结是否正常?
  • 我该如何使它不会冻结onPostExecute
+0

onPostexecute中是否存在其他长时间运行的任务? – 2013-04-24 09:30:10

+0

@ankitmakwana:是的,但'onPostExecute'是'AsyncTask'的一部分。如果'AsyncTask'是异步的,在'onPostExecute'里面有一个很长的进程不应该让Activity冻结,因为它运行在一个单独的线程上。 – Arci 2013-04-24 09:35:53

回答

2
  1. 你应该doInBackground方法做这样(database , network ,parsing的response.etc)所有的数据源操作。
  2. 如果你想更新异步任务使用onProgressUpdate
  3. 我认为你是在onPostExecute执行任何解析操作任何UI更新用。尝试在postexecute中获得过滤或parseddata(较轻的数据)。
0

确保您在AsynTask方法中使用了doInBackground方法。

+0

在doInBackground方法中移动长操作。 – 2013-04-24 09:35:46

1

为什么我的活动冻结onPostExecute?

根据您的文章,您执行一些耗时的操作 PostExecute方法。在PostExecute正在UI线程上运行,所以它是 没问题,你的UI被冻结了。

如果onPostExecute方法内的处理过长,Activity是否正常冻结?

是的,是的。你应该在doInBackground方法 (非UI线程)

如何让这样的,我的活动不会冻结onPostExecute进行长时间的操作?

尝试在长时间操作转移到doInBackground方法和 在PostExecute只更新UI根据响应,你在以后的方法doInBackground操作 得到。

+0

你能解释一下,为什么在onPostExecute里放一个长进程会导致屏幕冻结?这是因为我认为'onPostExecute'是异步的。 – Arci 2013-04-24 09:38:23

+0

是的,你是对的。 – 2013-04-24 10:45:39

+0

谢谢@Nickolai!我想检查你的答案,但是Gani给了我解决我的问题的方法,那就是将长时间运行的任务放在'onProgressUpdate'中。我在做一个UI更新,所以我不能把我的代码放在'doInBackground'里面。 – Arci 2013-05-21 09:23:05

0

看到长时间运行的任务需要在doInBackground这里绑定你不能绑定UI控件像ButtonImageViewdoInBackgroundonPostExecute建成后可绑定都需要控制,要确保此处[onPostExecute]你不捉迷藏另一个任务。

相关问题