Android - 将视图ID传递给AsyncTask

时间:2012-06-26 13:58:58

标签: android android-asynctask

我在主要活动上有很多按钮。每个按钮运行相同的AsyncTask,它执行HTTP POST方法,但发布不同的值(我存储在Button.Tag属性中)。所有按钮都有一个AsyncTask。问题是当AsyncTask完成他的工作时,它应该知道必须在回调中更新哪个按钮(执行AsyncTask的按钮)。我不希望将对象(按钮实例)传递给AsyncTask,因为我读过在很多情况下系统可以重新创建活动(方向更改等),因此传递给AsyncTask的对象可能无效。但是View.ID属性呢?它也可以由系统在活动生命周期中更改,或者我可以使用此整数值,将其传递给AsyncTask并在onPostExecute中通过此ID找到此按钮(调用findViewByID)?< / p>

此致

5 个答案:

答案 0 :(得分:2)

元素的id无法更改,因为它是由R.java上的Android生成的。所以你可以使用这个值。

答案 1 :(得分:1)

你的AsyncTask中应该有一个观察者,当你的Activity消失时你可以为null。

实施例

的活动:

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不应该在您的Activity中,因为如果您的Activity被销毁,它可能会导致内存泄漏。

答案 2 :(得分:1)

一个简单的想法是传递一个标识特定按钮的唯一值。例如,如果单击button1,则将“button1”传递给异步任务。在执行后,我们可以使用switch case来更新所需的按钮。简单那样。

编辑:最好还是使用findViewWithTag方法来识别按钮,因为你已经在asynctask中发送了一个标签值。在这种情况下不需要使用switch case

答案 3 :(得分:0)

是的,如果您确保您的视图都具有唯一标识符,无论是使用XML还是代码 - 然后在您的ViewGroup上调用findViewById(int id)以在AsyncTask完成后获取正确的视图(覆盖onPostExecute()在AsyncTask中,以确保您在UI线程上。)

编辑: 这假设您已经在片段/活动中创建了AsyncTask,并且可以在其上调用getView()来获取您的层次结构。

答案 4 :(得分:0)

如果你的内部异步任务是内部类,你可以通过调用findViewById(int id)来使用OnPostExecute中的整数id值。

在其他情况下,您要传递持有按钮的viewGroup。