У меня много кнопок на основной деятельности. Каждая кнопка запускает тот же AsyncTask
который выполняет HTTP POST-метод, но AsyncTask
разные значения (которые я храню в Button.Tag
). Поэтому у меня есть одна AsyncTask
для всех кнопок. Проблема в том, что AsyncTask
выполнил свою работу, он должен знать, какая кнопка должна быть обновлена в AsyncTask
(кнопка, выполняющая AsyncTask
). Я не хочу передать объект (экземпляр кнопки) в AsyncTask
потому что я читал, что активность может быть воссоздана системой во многих ситуациях (изменение ориентации и т.д.), Поэтому объект, переданный AsyncTask
может быть недействительным. Но как насчет свойства View.ID
? Он также может быть изменен системой в жизненном цикле активности, или я могу использовать это целочисленное значение, передать его AsyncTask
и в onPostExecute
найти эту кнопку с помощью этого идентификатора (вызывающего findViewByID
)?
С уважением
Если у вас есть задача async внутри вашей деятельности как внутренний класс, вы можете использовать значение целочисленного идентификатора в OnPostExecute, вызвав findViewById(int id)
.
В других случаях вы должны передать viewGroup, удерживая ваши кнопки.
Идентификатор элемента не может быть изменен, поскольку он генерируется Android на R.java. Поэтому вы можете использовать это значение, я думаю.
У вас должен быть наблюдатель в вашей AsyncTask, который вы можете указать, когда ваша активность исчезнет.
пример
Мероприятия:
private List<MyAsyncTask> mMyAsyncTasks;
private void addAsyncTask(MyAsyncTask task) {
mMyAsyncTasks.add(task);
}
public void onDestroy() {
for(MyAsyncTask task : mMyAsyncTasks) {
task.removeObserver();
}
}
Асинхронные задачи:
public class MyAsyncTask extends AsyncTask<Something, Something, Something> {
private MyAsyncTaskObserver mObserver;
private int mButtonId;
public MyAsyncTask(MyAsyncTaskObserver observer, int buttonId) {
mObserver = observer;
mButtonId = buttonId;
}
public void removeObserver() {
mObserver = null;
}
public void onPostExecute(Something result) {
...
if (mObserver != null) {
mObserver.onMyDataAvailable(result, mButtonId);
}
}
}
Кроме того, ваш AsyncTask не должен находиться внутри вашей деятельности, так как это может привести к утечке памяти, если ваша активность будет уничтожена.
Простая идея заключалась бы в том, чтобы передать уникальное значение, которое идентифицирует конкретную кнопку. Например, если кнопка1 нажата, перейдите 'button1' к задаче async. В ходе выполнения post мы можем использовать случаи переключения для обновления желаемой кнопки.
Изменение: лучше использовать метод findViewWithTag для идентификации кнопки, так как вы уже отправляете значение тега в asynctask. В этом случае не нужно использовать случаи переключения
Да, если вы убедитесь, что ваши представления имеют уникальные идентификаторы, независимо от того, сделаны они в XML или коде, а затем вызовите findViewById(int id)
в вашей ViewGroup, чтобы получить правильный вид после завершения работы AsyncTask (переопределите onPostExecute()
в AsyncTask, чтобы убедиться, что вы 're в потоке пользовательского интерфейса).
EDIT: Предполагается, что вы создали свой AsyncTask в фрагменте/активности и можете вызвать getView()
на нем, чтобы получить вашу иерархию.