Во-первых, я хотел бы предложить, чтобы, если пользователь нажал на что-то, он должен увидеть какой-то немедленный результат, в вашем случае, если действие кнопки должно ждать чего-то, добавьте анимацию загрузки круга на кнопку, чтобы немедленно сигнализировать пользователюдействие произойдет в ближайшее время.
Теперь для самого действия, если существует только одно (или несколько) таких возможных действий, которые происходят после одного (или нескольких) возможных фоновых процессов, у меня будет кнопка синхронно поднять флаг (возможно, через постоянный член класса) и выполнить длинный процесс синхронно для проверки этого флага после его завершения и выполнения запрошенного действия по окончании.
Другой возможный вариант, если использовать ожидание и уведомление, чтобы код кнопки ожидал завершения процесса, это обычно считается очень высокопроизводительным решением в Java: например,
(игнорируйте опечатки, это на-spot):
button.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
v.post(new Runnable() {
@Override
public void run() {
synchronized (lockObject) {
try {
lockObject.wait();
doAction();
} catch (InterruptedException e) {}
}
}
}
}
}
Затем завершите длинный процесс notify
.
Обратите внимание, что new Runnable()
не создает новый поток, он просто добавляет Runnable
в очередь потоков View
Как подсказывают мыши, обработчик кнопки onClickследует проверить, не запущен ли в данный момент процесс, и если это так, просто выполнить действие немедленно.
Таким образом, вам не нужно создавать новый поток (или AsyncTask, который фактически является пулом потоков)