Мое приложение выполняет следующие действия:
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
}
};
Когда я пытаюсь связаться с другими частями службы (установить переменную или что-то в этом роде), все работает нормально.