AsyncTask не доступен в Сервисе - PullRequest
       18

AsyncTask не доступен в Сервисе

2 голосов
/ 20 февраля 2010

Мое приложение выполняет следующие действия:

Activity1 запускает Activity2.
Acitivity2 запускает Сервис.
Служба использует AsyncTask для загрузки файла.

В AsyncTask у меня есть такой код:

while ((status == 0)) {

            byte buffer[];
            if (size - downloaded > MAX_BUFFER_SIZE) {
                buffer = new byte[MAX_BUFFER_SIZE];
            } else {
                buffer = new byte[size - downloaded];
            }

            int read = stream.read(buffer);
            if (read == -1)
                break;

            file.write(buffer, 0, read);
            downloaded += read;

  }

Все работает как положено. С помощью переменной status я могу запускать и останавливать загрузку в зависимости от ее значения.

НО, когда я закрываю Activity2 и запускаю его снова (служба продолжает работать), я не могу остановить загрузку, что означает, что переменная status не читается правильно. Я проверил переменную, значение в порядке, но Asynctask не распознает ее.

Как вернуть контроль над AsyncTask?

Я провел еще несколько тестов, но на этот раз с потоком, чтобы убедиться, что это не ошибка в том, как я справляюсь с AsyncTask. Я сделал это так:

Activity2 запускает Службу (здесь я не менял код). Служба создает объект Download, который загружает файл, используя поток.

Структура выглядит так:

in the Service
private Download dl = new Download();

private final DMInterface.Stub mBinder = new DMInterface.Stub() {

    public void downloadFile() throws DeadObjectException {
        try {
            dl.start(url) // This starts a thread and the download

        } catch (IndexOutOfBoundsException e) {
            Log.e(getString(R.string.app_name), e.getMessage());
        }
    }

    public void stop() throws DeadObjectException {
        dl.cancel(); //This stops the download
    }

};

И снова все работает, пока я не отключусь от сервиса. Почему я могу контролировать поток, только когда не отключаюсь от службы?

Вот код, с которого я запускаю / привязываю сервис к Activity2 (только они являются важными частями):

public class Activity2 extends ListActivity {

  private DMInterface dmInterface;

  public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        this.bindService(new Intent(Activity2.this, DMService.class), mConnection, Context.BIND_AUTO_CREATE);
  }

    private ServiceConnection mConnection = new ServiceConnection() {
        public void onServiceConnected(ComponentName className, IBinder service) {
            dmInterface = DMInterface.Stub.asInterface(service);
            //do some stuff

        }

        public void onServiceDisconnected(ComponentName className) {
            dmInterface = null;
        }
    };
}

Есть два сценария. В первом я получаю ошибку, во втором нет (но больше ничего не происходит). Когда возникает ошибка, зависит от того, где я инициализирую поток, например, объект, который запускает поток.

Сценарий 1:

Когда я делаю это, как описано выше, я не получаю ошибку, но ничего не происходит.

Сценарий 2:

В службе:

private Download dl;

private final DMInterface.Stub mBinder = new DMInterface.Stub() {

    public void downloadFile() throws DeadObjectException {
        try {
            dl = new Download();
            dl.start(url) // This starts a thread and the download

        } catch (IndexOutOfBoundsException e) {
            Log.e(getString(R.string.app_name), e.getMessage());
        }
    }

    public void stop() throws DeadObjectException {
        dl.cancel(); //This stops the download
    }

};

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

1 Ответ

1 голос
/ 21 февраля 2010

A Служба живет в своем собственном мире, будучи Службой, удаленной от остальной части вашей программы. Binder может использоваться для связи с вашим сервисом. Определение интерфейса aidl с помощью метода setStatus позволяет сообщать статус службе.

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