在DoInBackground或Asynctask的PostExecute中工作

时间:2019-04-08 09:22:08

标签: android android-asynctask

我正在使用Microsoft Azure Face Api从图像中获取一些信息的Android应用程序中工作。对图像中的所有人员进行分析之后,我可以正确地在postExecute()调用中获得结果,但是如果我检测到特定人员,则需要进行一些更改(如果检测到该特定人员,则所有工作都将有所不同)。

我正确地检测到此人,但是我想知道是否可以在DoInBackground()中完成我的工作,所以我不需要等待结果(因为如果我检测到此人,则需要发送套接字消息并且结果无效)。

我实际上在onResult上收到了完整的人员列表,然后浏览所有这些列表以查找特定人员并发送套接字消息。我想知道是否能在DoInBackground()中检测到该人并取消其余执行后立即发送此消息。

2 个答案:

答案 0 :(得分:1)

考虑官方文档:

doInBackground(Params ...),在onPreExecute()完成执行后立即在后台线程上调用。此步骤用于执行可能需要很长时间的后台计算。异步任务的参数将传递到此步骤。计算结果必须通过此步骤返回,并将传递回最后一步。此步骤还可以使用publishProgress(Progress ...)发布一个或多个进度单位。这些值在onProgressUpdate(Progress ...)步骤中发布在UI线程上。

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

可以通过调用cancel(boolean)随时取消任务。调用此方法将导致对isCancelled()的后续调用返回true。调用此方法后,在doInBackground(java.lang.Object [])返回之后,将调用onCancelled(java.lang.Object)而不是onPostExecute(java.lang.Object)。为了确保尽快取消任务,如果可能的话(例如在循环内),应始终定期从doInBackground(java.lang.Object [])检查isCancelled()的返回值。

因此,如果您想停止任务,可以执行以下操作:

class myAsyncTaskClass(val pictures:List<Pictures>, Void, Boolean){

    fun doInBackground(var args){ 
    // Check all your pictures, if you find the right face stop your task
       if (specificPersonIsDectected){
         cancel()
         return specificPersonIsDectected
         }
    }

    fun onCancelled(var specificPersonIsDectected){
      //Notify you found the specific person
    }
   }

我建议您阅读the official documentation,以了解如何使用AsyncTask

答案 1 :(得分:0)

您需要像这样使用break

if (isCancelled()) break;

在doInBackground方法内部