5

我有一个包含 Fragment 的片段活动,Fragment 启动了一个下载一些数据的 Asynctask,我在我的 Fragment 中实现了一个回调方法,该方法更新了适配器和列表视图中的一些值。我遇到的问题如下:这是我的 onCreateView 方法(重要部分):

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    list=(PullToRefreshListView)v1.findViewById(R.id.listapull);
    adapterList=new ListViewAdapter(secciones, mContext);
}

当我在 AsyncTask 运行时旋转设备时,doInBackground() 方法继续运行,然后在执行后触发侦听器并在我的片段中启动回调方法,此方法具有我的适配器和列表视图的旧引用: 在此处输入图像描述

当方向改变发生并且这是正确的时,片段及其内容被重新创建,但是有谁知道为什么回调方法保留对在方向改变之前创建的适配器和列表视图的引用?

编辑:

我有一个执行异步任务的按钮,如下所示:

asyncRefresh = new PullRefreshTask(taskContext, mContext, secciones);
asyncRefresh.setUpdatePull2RefreshListener(this);
asyncRefresh.execute();

如果用户按下按钮,asyncTask 会将旧 Fragment 设置为侦听器,并且当 asynctask 运行时发生方向更改时,我认为激活的回调方法是来自新创建的片段方法的方法,但我不确定了。

编辑2:

我已经解决了我的问题,正如我在第一次编辑中所说的那样,正在为旧片段调用回调方法。所以我所做的是将我的 asynctask 保存在另一个名为“Info”的类中的变量中,并在创建视图中这样做:

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        list=(PullToRefreshListView)v1.findViewById(R.id.listapull);
        adapterList=new ListViewAdapter(secciones, mContext);
        PullRefreshTasktask task = Info.getAsyncTask();
        asyncRefresh =  task;
        asyncRefresh.setUpdatePull2RefreshListener(this);
    }

这样我在我的片段中设置了新的引用

setUpdatePull2RefreshListener()

正在运行的 asynctask 的方法

4

1 回答 1

1

...有谁知道为什么回调方法保留对在方向更改之前创建的适配器和列表视图的引用?

(这个答案在不知道你的回调实现或你的AsyncTask外观的情况下出现)为什么回调不应该保留对旧片段的引用?您在那个Button监听器中设置当前 Fragment实例,然后在任务运行时进行设备旋转。您没有任何代码Fragment,因为它在配置更改后重建,将更新您的回调实例AsyncTask以指向新片段。根据您的使用方式,Fragment您可以使用Fragment.setRetainInstance()防止Fragment被销毁的方法,因此即使在轮换之后,您的任务也将具有相同的回调实例。另请查看一位 Android 工程师关于此特定问题的答案

于 2012-11-22T19:57:01.067 回答