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