繁体   English   中英

在 DoInBackground 或 Asynctask 的 PostExecute 中工作

[英]Working in the DoInBackground or in the PostExecute of an Asynctask

我正在使用 Microsoft Azure Face Api 从图像中获取一些信息的 Android 应用程序中工作。 在分析了图像中的所有人之后,我在 postExecute() 调用中得到了正确的结果,但是现在如果我检测到特定的人,我需要做一些更改(如果检测到这个特定的人,所有的工作都不同)。

我正确地检测到了这个人,但我想知道我是否可以在 DoInBackground() 中完成我的工作,这样我就不需要等待结果(因为如果我检测到这个人,我需要发送一个套接字消息和结果无效)。

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

考虑官方文档:

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

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
    }
   }

我鼓励您阅读官方文档以了解您应该如何使用 AsyncTask

你需要像这样使用break

if (isCancelled()) break;

在 doInBackground 方法中

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM