Android - передача идентификатора вида в AsyncTask

1

У меня много кнопок на основной деятельности. Каждая кнопка запускает тот же AsyncTask который выполняет HTTP POST-метод, но AsyncTask разные значения (которые я храню в Button.Tag). Поэтому у меня есть одна AsyncTask для всех кнопок. Проблема в том, что AsyncTask выполнил свою работу, он должен знать, какая кнопка должна быть обновлена в AsyncTask (кнопка, выполняющая AsyncTask). Я не хочу передать объект (экземпляр кнопки) в AsyncTask потому что я читал, что активность может быть воссоздана системой во многих ситуациях (изменение ориентации и т.д.), Поэтому объект, переданный AsyncTask может быть недействительным. Но как насчет свойства View.ID? Он также может быть изменен системой в жизненном цикле активности, или я могу использовать это целочисленное значение, передать его AsyncTask и в onPostExecute найти эту кнопку с помощью этого идентификатора (вызывающего findViewByID)?

С уважением

  • 0
    Вы можете использовать целочисленное значение can, но проблема в том, что вам все еще нужна ссылка на активность, чтобы использовать findViewByID.
Теги:
android-asynctask

5 ответов

0
Лучший ответ

Если у вас есть задача async внутри вашей деятельности как внутренний класс, вы можете использовать значение целочисленного идентификатора в OnPostExecute, вызвав findViewById(int id).

В других случаях вы должны передать viewGroup, удерживая ваши кнопки.

  • 0
    Это может привести к утечке памяти, если действие уничтожено, когда AsyncTask находится в doInBackground. Ему придется уничтожить AsyncTask в методе onDestroy его Activity.
  • 0
    Я знаю, что этот ответ теперь помечен как принятый, но еще раз подчеркиваю, что это вызывает утечку памяти и может привести к неожиданным функциям в будущем. См. Stackoverflow.com/questions/3033007/…
Показать ещё 2 комментария
2

Идентификатор элемента не может быть изменен, поскольку он генерируется Android на R.java. Поэтому вы можете использовать это значение, я думаю.

1

У вас должен быть наблюдатель в вашей 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

Простая идея заключалась бы в том, чтобы передать уникальное значение, которое идентифицирует конкретную кнопку. Например, если кнопка1 нажата, перейдите 'button1' к задаче async. В ходе выполнения post мы можем использовать случаи переключения для обновления желаемой кнопки.

Изменение: лучше использовать метод findViewWithTag для идентификации кнопки, так как вы уже отправляете значение тега в asynctask. В этом случае не нужно использовать случаи переключения

0

Да, если вы убедитесь, что ваши представления имеют уникальные идентификаторы, независимо от того, сделаны они в XML или коде, а затем вызовите findViewById(int id) в вашей ViewGroup, чтобы получить правильный вид после завершения работы AsyncTask (переопределите onPostExecute() в AsyncTask, чтобы убедиться, что вы 're в потоке пользовательского интерфейса).

EDIT: Предполагается, что вы создали свой AsyncTask в фрагменте/активности и можете вызвать getView() на нем, чтобы получить вашу иерархию.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню