我的应用程序包含一个需要时间加载(解析文件)的函数。 在多个用户情况下调用该函数,即从多个用户触发的条件调用。 此外,调用onCreate时会调用它。
简单来说,流程是:
我希望用户可以点击取消来停止解析文件。
我尝试使用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 :(得分:0)
理想情况下,AsyncTasks应该用于短操作(最多几秒钟)。 执行异步任务时,任务将执行4个步骤:
onPreExecute(),在执行任务之前在UI线程上调用。此步骤通常用于设置任务,例如通过在用户界面中显示进度条。
doInBackground(Params ...),在onPreExecute()完成执行后立即在后台线程上调用。此步骤用于执行可能需要很长时间的后台计算。此步骤还可以使用publishProgress(Progress ...)来发布一个或多个进度单元。这些值发布在UI线程的onProgressUpdate(Progress ...)步骤中。
onProgressUpdate(Progress ...),在调用publishProgress(Progress ...)后在UI线程上调用。执行的时间是不确定的。此方法用于在后台计算仍在执行时显示用户界面中的任何形式的进度。例如,它可用于为进度条设置动画或在文本字段中显示日志。
onPostExecute(Result),在后台计算完成后在UI线程上调用。后台计算的结果作为参数传递给此步骤。
<强>编码强>
启动异步任务
mTask = new YourAsyncTask().execute();
并取消该任务
mTask.cancel(true);
有更多详情可供here
答案 1 :(得分:0)
要使用AsyncTask API,必须按照以下步骤操作:
在类中填写可用作泛型的泛型类型:
任务执行数组参数
进度数组参数
结果数组参数
实现方法doInBackground(参数...参数)。这个 方法必须执行应该要求很高的工作。
可选地,可以实现以下方法:
取消任务 - onCancelled(...)
在要求严格的任务之前执行任务 - onPreExecute(...)
报告进度 - onProgressUpdate(...)
在完成任务后执行活动 -onPostExecute(...)。