Работа в DoInBackground или в PostExecute Asynctask - PullRequest
0 голосов
/ 08 апреля 2019

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

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

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

Ответы [ 2 ]

1 голос
/ 08 апреля 2019

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

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

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

Задачу можно отменить в любое время, вызвав метод cancel (логическое значение).Вызов этого метода приведет к тому, что последующие вызовы isCancelled () вернут true.После вызова этого метода вместо onPostExecute (java.lang.Object) будет вызываться onCancelled (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

0 голосов
/ 08 апреля 2019

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

if (isCancelled()) break;

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...