Работа в DoInBackground или в PostExecute асинтаска

Я работаю в приложении для Android, которое использует Microsoft Azure Face Api для получения некоторой информации с изображения. После анализа всех людей на изображении я правильно получаю результаты в вызове postExecute(), но теперь мне нужно внести некоторые изменения, если я обнаружу конкретного человека (вся работа отличается, если этот конкретный человек обнаружен).

Я правильно обнаруживаю этого человека, но я хочу знать, могу ли я выполнять свою работу в DoInBackground(), чтобы мне не нужно было ждать результата (потому что, если я обнаружил этого человека, мне нужно отправить сообщение сокета и результат не действует).

На самом деле я получаю полный список людей в onResult, затем просматриваю весь этот список, чтобы найти конкретного человека и отправить сообщение сокета. Я хочу знать, смогу ли я отправить это сообщение, как только обнаружу этого человека в DoInBackground() и отменю остальную часть выполнения.

1
0
63
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вам нужно использовать break вот так

if (isCancelled()) break;

внутри метода doInBackground

Ответ принят как подходящий

Учитывая официальную документацию:

doInBackground(Params...), вызывается в фоновом потоке сразу после завершения выполнения onPreExecute(). Этот шаг используется для выполнения фоновых вычислений, которые могут занять много времени. На этот шаг передаются параметры асинхронной задачи. Результат вычисления должен быть возвращен на этом шаге и будет передан обратно на последний шаг. На этом шаге также можно использовать publishProgress(Progress...) для публикации одной или нескольких единиц прогресса. Эти значения публикуются в потоке пользовательского интерфейса на шаге onProgressUpdate(Progress...).

onPostExecute(Result), вызывается в потоке пользовательского интерфейса после завершения фоновых вычислений. Результат фонового вычисления передается на этот шаг в качестве параметра.

Задачу можно отменить в любое время, вызвав команду отмены (логическое значение). Вызов этого метода приведет к тому, что последующие вызовы isCancelled() вернут true. После вызова этого метода onCancelled(java.lang.Object) вместо onPostExecute(java.lang.Object) будет вызываться после возврата doInBackground(java.lang.Object[]). Чтобы убедиться, что задача отменена как можно быстрее, вы всегда должны периодически проверять возвращаемое значение isCancelled() из doInBackground(java.lang.Object[]), если это возможно (например, внутри цикла).

Итак, если вы хотите остановить задачу, вы можете сделать что-то вроде:

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.

Спасибо за ответ, Роберт, я уже прочитал документацию и знал, что могу сделать этот тип «отмены», я должен был больше ориентировать свой вопрос на «можно ли отправлять сообщение сокета в onCancelled?»

Gerard E 08.04.2019 12:22

Ну да, если вам больше не нужна ваша AsyncTask для выполнения каких-либо фоновых вычислений, вам следует использовать либо onPostExecute(), либо onCancel() для «задания уведомления».

Robert LaFondue 08.04.2019 12:32

Другие вопросы по теме