Что происходит с асинхронными задачами после включения?

#android

#Android

Вопрос:

У меня есть асинхронная задача, которая выполняется до того, как я перейду к следующему действию. Внутри этой асинхронной задачи у меня есть медиаплеер.

  protected void onPause() {
           stopProgress();
           Log.i(TAG, "onPAUSE");
           try  {
           } finally {
           // If we allocated a player, then cleanup after it
           if (player != null) {
               player.reset();
               player.release();
               player = null;
               Log.d(TAG,"end of player cleanup");
                            }
            }
            super.onPause();
         }
  

Сценарий использования:

  1. Нажмите кнопку воспроизведения в упражнении 1
  2. Переходите к действию 2 еще до загрузки проигрывателя (определенно вызывается информация журнала из onPause).
  3. Во время выполнения действия 2 проигрыватель из действия 1 воспроизводится после завершения загрузки.

Ответ №1:

С AsyncTask ничего не должно произойти. Он будет продолжать выполняться. Однако это не лучший способ запустить медиаплеер в фоновом режиме (для этого используйте сервис). Ваш код отключит медиаплеер, но в зависимости от того, что у вас есть в вашей асинхронной задаче, он может быть все еще активен. Вы можете убедиться, что AsyncTask завершается вызовом cancel (boolean mayInterruptIfRunning) задачи.

Если по какой-либо причине ваш MediaPlayer объект все еще выполняется с использованием приведенного выше кода, то вызовите AsyncTask.cancel(true) и переопределите void onCancelled (Result result) , а затем завершите MediaPlayer работу из вашего потока. Помните, onCancelled будет вызываться только ПОСЛЕ doInBackground возврата (или вы можете периодически проверять, isCancelled() вызывалось ли что-то cancel() в вашем потоке. Если вы установите cancel(true) , то я полагаю, что это не будет беспокоить ожидание doInBackground завершения, но, конечно, это не так чисто.

Ответ №2:

Я не знаю точно, что вы делаете в своей AsyncTask, но что бы это ни было, оно должно продолжаться, даже если оно onPause() вызвано. Если onDestroy() вызывается, и у вас есть AsyncTask, ссылающийся на что-либо в вашей деятельности, вы столкнетесь с проблемами, потому что AsycnTask, по сути, начнет выдавать исключения с нулевым указателем.

Комментарии:

1. при вызове onDestroy() асинхронная задача в нем должна быть отменена.