1

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

问候

4

5 回答 5

2

一个元素的id不能改变,因为它是Android在R.java上生成的。所以你可以使用我认为的这个值。

于 2012-06-26T14:06:44.363 回答
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 不应该在您的 Activity 中,因为如果您的 Activity 被销毁,它可能会导致内存泄漏。

于 2012-06-26T14:10:27.423 回答
1

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

编辑:最好还是使用findViewWithTag方法来识别按钮,因为您已经将标签值发送到异步任务。在这种情况下不需要使用 switch 案例

于 2012-06-26T14:15:54.870 回答
0

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

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

于 2012-06-26T14:05:18.873 回答
0

如果您在活动中将异步任务作为内部类,则可以通过调用 OnPostExecute 使用整数 id 值findViewById(int id)

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

于 2012-06-26T14:07:24.033 回答