回调参考旧片段的方法

时间:2012-11-22 18:07:17

标签: android

我有一个包含Fragment的片段活动,Fragment启动了一个下载一些数据的Asynctask,我在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()方法继续运行,然后在post执行后触发侦听器并在我的片段中启动回调方法,此方法具有我的适配器的旧引用和我的列表显示: enter image description here

当方向更改发生且正确时,会重新创建片段及其内容,但有没有人知道为什么回调方法会保留对适配器和listview的引用,以及在方向更改之前创建的位置?

修改

我有一个执行asynctask的按钮,如下所示:

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的方法

1 个答案:

答案 0 :(得分:1)

  

...有谁知道为什么回调方法保持参考   到适配器和列表视图,在方向之前创建的位置   改变?

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