2014-01-09 51 views
0

我的应用程序包含一个函数,需要花费时间来加载(解析文件)。 该功能是在多用户情况下调用的,即来自多用户触发条件。 此外,它调用onCreate时调用。安卓异步任务的使用顺序依赖任务

在简单的一句话,流量:

  1. 用户点击/ OnCreate中触发
  2. 功能解析文件
  3. 后到窗口
  4. 其他后期处理时

希望用户可以点击取消来停止解析文件。

我试着用asynctask。我知道我可以把函数放在onPostExecute上。 但我认为onPostExecute只是用于解雇进度对话框。或者我必须将很多代码(针对不同情况)移动到它。不是一个好主意。

我不假设用户在解析文件时做任何事情。

那么,最好的办法是什么?尽管我知道它不好,但我认为我必须占用UI线程。

简而言之,我想等待“解析文件”,但我不想占用UI线程,因此用户可以单击取消。

更新: 我试过了。但是,有一个问题: 我使用asynctask。我打电话给:

mTask = new YourAsyncTask().execute(); 
YourAsyncTask.get(); // this force to wait for YourAsyncTask to return. 
DoSomethingBaseOnAsyncTaskResult(); 

YourAsyncTask.get()持有UI线程。因此,没有加载对话框,并且用户无法从对话框中单击取消。看来我以后

mTask = new YourAsyncTask().execute(); 

每行移动到

OnPostExecute() 

但我并不喜欢这样做,因为DoSomethingBaseOnAsyncTaskResult()可以根据返回的结果有很大的不同。否则,就成了YourAsyncTask()做的一切

回答

0

AsyncTasks应该理想地(最多几秒钟)。 当执行异步任务,任务经过4个步骤用于短操作:

onPreExecute(),在任务执行前在UI线程上调用。此步骤通常用于设置任务,例如通过在用户界面中显示进度条。

doInBackground(Params ...),在onPreExecute()完成执行后立即在后台线程上调用。此步骤用于执行需要很长时间的后台计算。此步骤还可以使用publishProgress(Progress ...)发布一个或多个进度单元。这些值在onProgressUpdate(Progress ...)步骤中发布在UI线程上。

onProgressUpdate(Progress ...),在调用publishProgress(Progress ...)后在UI线程上调用。执行的时间是未定义的。此方法用于在后台计算仍在执行时在用户界面中显示任何形式的进度。例如,它可以用来为进度条设置动画效果或在文本字段中显示日志。

onPostExecute(Result),在后台计算完成后在UI线程上调用。后台计算的结果作为参数传递给此步骤。

CODING

要启动一个异步任务

mTask = new YourAsyncTask().execute(); 

,并取消该任务

mTask.cancel(true); 

更多详细信息,请here

+0

请参阅我的问题的更新,感谢了很多! – manhon

+0

请详细说明您的要求。 –

0

邻要使用AsyncTask API,必须遵循下述步骤:

  1. 创建一个扩展AsyncTask的类。
  2. 填写可在类仿制药的泛型类型:

    • 任务执行数组参数

    • 进步阵列参数

    • 结果数组参数

  3. 执行m ethod doInBackground(参数...参数)。这种方法必须执行应该相当苛刻的工作。

  4. 可选,一个可以实现的方法:

    • 取消任务 - onCancelled(...)

    • 苛刻的任务之前执行的任务 - onPreExecute(...)

    • 报告进度 - onProgressUpdate(...)

    • 执行d后的活动要求任务完成 -onPostExecute(...)。