我正在使用Microsoft Azure Face Api从图像中获取一些信息的Android应用程序中工作。对图像中的所有人员进行分析之后,我可以正确地在postExecute()调用中获得结果,但是如果我检测到特定人员,则需要进行一些更改(如果检测到该特定人员,则所有工作都将有所不同)。>
我正确地检测到此人,但是我想知道是否可以在DoInBackground()中完成我的工作,所以我不需要等待结果(因为如果我检测到此人,则需要发送套接字消息并且结果无效)。
我实际上在onResult上收到了完整的人员列表,然后浏览所有这些列表以查找特定人员并发送套接字消息。我想知道是否能在DoInBackground()中检测到该人并取消其余执行后立即发送此消息。
答案 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方法内部