我有一个包含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);
}
Run Code Online (Sandbox Code Playgroud)
当我在AsyncTask运行时旋转设备时,doInBackground()方法继续运行,然后在执行后它触发侦听器并在我的片段中启动回调方法,此方法具有我的适配器和列表视图的旧引用:
当方向发生变化并且这是正确的时,会重新创建片段及其内容,但有没有人知道为什么回调方法保持对适配器和listview的引用,以及在方向更改之前创建的位置?
编辑:
我有一个执行asynctask的按钮,如下所示:
asyncRefresh = new PullRefreshTask(taskContext, mContext, secciones);
asyncRefresh.setUpdatePull2RefreshListener(this);
asyncRefresh.execute();
Run Code Online (Sandbox Code Playgroud)
如果用户按下按钮,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);
}
Run Code Online (Sandbox Code Playgroud)
这样我就可以在我的片段中设置片段的新引用
setUpdatePull2RefreshListener()
运行asynctask的方法
...有谁知道为什么回调方法保留对方向更改之前创建的适配器和列表视图的引用?
(这个答案是在不知道你的回调实现或你的AsyncTask
外观的情况下得出的)为什么回调不应该保留对旧片段的引用?Button
您在该侦听器中设置当前 Fragment
实例,然后在任务运行时进行设备旋转。您的代码中没有任何代码Fragment
,因为它是在配置更改后重建的,将更新您的回调实例AsyncTask
以指向新的片段。根据您的使用方式,Fragment
您可以使用Fragment.setRetainInstance()
防止Fragment
被破坏的方法,这样您的任务即使在轮换之后也将具有相同的回调实例。另请参阅一位 Android 工程师关于此特定问题的回答。
归档时间: |
|
查看次数: |
1027 次 |
最近记录: |