我的设置如下。
我有一个从我的 Activity 调用的 FragmentPagerAdapter,它加载了两个片段。这是在 onCreate 中设置的。
在 onResume 中,我调用了从数据库加载数据的 ASyncTask,然后通过加载数据侦听器在我的活动 onLoadComplete 中调用回调。
@Override
public void onLoadComplete(JSONArray data) {
// TODO Auto-generated method stub
LocalFragment fragmentB = (LocalFragment)getSupportFragmentManager().findFragmentByTag(ListTag);
fragmentB.setList(data);
LMapFragment fragmentA = (LMapFragment)getSupportFragmentManager().findFragmentByTag(MapTag);
GoogleMap our_map = fragmentA.getMap();
fragmentA.plotP(myLocation,data);
}
片段由寻呼机初始化,并在每个片段代码中设置相应的标签,例如在 LocalFragment
@Override
public void onAttach(Activity activity) {
// TODO Auto-generated method stub
super.onAttach(activity);
String myTag = getTag();
((PagerTest) activity).setListTag(myTag);
Log.d("what",myTag);
}
这允许我访问片段,在其中调用填充列表或填充地图的函数。有用。
我现在要做的是考虑屏幕方向的变化。如果在 ASyncTask 运行时方向发生了变化,应用程序就会崩溃。
正如这里所建议的:隐藏片段我一直在尝试实现一个隐藏片段,它可以保存我的 ASyncTask 的状态。所以我所做的就是设置它,所以在我的活动的 onResume 中我调用了一个函数
static LoadDataFromURL the_data = null;
static JSONArray pub_data = null;
private static final String TAG = "RetainFragment";
public RetainFragment() {}
public static RetainFragment findOrCreateRetainFragment(FragmentManager fm) {
RetainFragment fragment = (RetainFragment) fm.findFragmentByTag(TAG);
if (fragment == null) {
fragment = new RetainFragment();
fm.beginTransaction().add(fragment, TAG).commit(); // add this
}
return fragment;
}
这基本上保存了我的数据。
基本上这意味着如果我旋转我的屏幕,我不会再次调用我的 ASyncTask .. 屏幕只是旋转.. 它工作得很好。
但是,如果我返回主菜单,然后再次单击活动,屏幕将返回空白(但不会崩溃)。我的理解是数据作为一个对象保留在片段中,但是在重新加载活动时,需要再次设置数据。需要调用 IE onLoadComplete 来填充列表/地图。
所以我得出结论,如果最初在 ASyncTask 完成后我将返回的数据保存在我的隐藏片段 onRetainInstance 中,那么我可以简单地调用 onLoadComplete 并传递它..
问题是,在这种情况下,似乎还没有调用片段,因为标签是空的,并且在 onLoadComplete 中调用回调会使应用程序崩溃。
多年来,我一直在努力解决这个问题。
我的 ASyncTask 在一个单独的类中: LoadDataFromURL 我想要实现如下 - 一个 fragmentviewpager 在屏幕上旋转 ASyncTask 在旋转/附加到新活动时保留,如果它在不应该再次运行之前完成..
任何人都可以建议。
非常感谢
编辑
将我的秘密片段中的变量更改为公共变量后,一切似乎都融合在一起了。但是因为我不是 100% 确定如何/何时调用事物,所以我不完全理解它为什么起作用。
所以.. 我调用 findOrCreateRetainFragment ,它要么创建一个新的“秘密”片段,要么返回当前实例。
如果它返回当前实例,我不会再次调用我的异步任务。如果不是,我调用我的 asynctask 并加载数据。
使用此设置,当我加载活动并旋转屏幕时,它会按预期旋转。
现在,当我返回主菜单然后再次单击活动时,它会调用异步任务。
我的理解是,在旋转时不再调用异步任务,并且 viewpager 以某种方式保存了片段。
另一方面,当我返回时,我的活动被破坏,我的秘密片段也是如此,因此当我再次单击它时,它会加载数据。这基本上是我想要的..
我是否正确理解了这一点?
谢谢