回调方法涉及旧片段的问题

5
我可以协助你进行文本翻译。以下是需要翻译的内容:

我有一个包含Fragment的片段活动,该Fragment启动一个异步任务以下载一些数据,我在我的Fragment中实现了回调方法,用于更新适配器和ListView中的某些值。我遇到的问题是:这是我的onCreateView方法(重要部分):

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

当我在AsyncTask运行时旋转设备时,doInBackground()方法继续运行,然后在postExecute()中触发侦听器并启动我的片段中的回调方法,该方法具有我适配器和列表视图的旧引用: enter image description here

片段及其内容在方向更改时被重新创建,这是正确的,但是否有人知道为什么回调方法保留了先前创建的适配器和列表视图的引用?

编辑:

我有一个按钮,像这样执行asynctask:

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

如果用户按下按钮,asyncTask将把旧片段设置为侦听器,当异步任务正在运行时发生方向更改时,我认为激活的回调方法是新创建的片段方法中的回调方法,但我不确定了。
编辑2:
我已解决我的问题,正如我在第一次编辑中所说,回调方法被调用的是旧片段。所以我做的是在另一个名为“Info”的类中将我的asynctask保存在一个变量中,在onCreateView中我这样做:
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()

方法中设置了我的片段的新引用。

从调试器的屏幕上看,adapterListFragment 内部类的一个实例。这可能是问题所在吗? - ernazm
1个回答

1
有人知道为什么回调方法会保留旋转之前创建的适配器和列表视图的引用吗?
(在不了解你的回调实现或者你的AsyncTask代码的情况下得出这个答案)为什么回调不应该保留对旧Fragment的引用?你在那个按钮的监听器中设置了当前Fragment的实例,同时任务运行时进行设备旋转。你没有在重构后的Fragment中添加任何代码去更新AsyncTask中的回调实例,以使其指向新的Fragment。根据你使用该Fragment的方式,你可以使用Fragment.setRetainInstance()方法来防止Fragment被销毁,这样即使旋转后,任务也将具有相同的回调实例。另外,参考一位Android工程师就此问题的一个回答。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接