作者热门文章
- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我有一个带有 MapFragment
的 Activity
,我使用 FragmentTransaction
以编程方式将其添加到 Activity
:
private static final String MAP_FRAGMENT_TAG = "map";
private MapFragment mapFragment = null;
...
protected void onCreate(Bundle savedInstanceState) {
...
mapFragment = (MapFragment) getFragmentManager().findFragmentByTag(MAP_FRAGMENT_TAG);
if (mapFragment == null) {
mapFragment = MapFragment.newInstance();
FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction();
fragmentTransaction.add(R.id.fragment_wrapper, mapFragment, MAP_FRAGMENT_TAG);
fragmentTransaction.commit();
}
...
}
标准方式。然后我从 mapFragment
获取 GoogleMap
实例并设置它的设置,设置监听器,用它做一些事情。一切正常。
然后当用户完成 map 时,AsyncTask
被触发以显示 ProgressDialog
,执行一些操作,将不同的 fragment 放入 fragment_wrapper
并再次关闭 ProgressDialog
:
private class GetFlightsTask extends AsyncTask<Double, Void, String> {
@Override
protected void onPreExecute() {
super.onPreExecute();
// the activity context has been passed to the AsyncTask through its constructor
loadingFlightsSpinner = new ProgressDialog(context);
// setting the dialog up
loadingFlightsSpinner.show();
}
@Override
protected String doInBackground(Double... params) {
// some pretty long remote API call
// (loading a JSON file from http://some.website.com/...)
}
@Override
protected void onPostExecute(String flightsJSON) {
super.onPostExecute(flightsJSON);
// here I do stuff with the JSON and then I swtich the fragments like this
FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction();
FlightsFragment fragment = new FlightsFragment();
fragmentTransaction.replace(R.id.fragment_wrapper, fragment);
fragmentTransaction.addToBackStack(null);
fragmentTransaction.commit();
loadingFlightsSpinner.dismiss();
}
一切仍然正常。用户在 FlightsFragment
中做了一些事情,然后可能决定返回 map 。按后退 按钮, map 会再次弹出。这是 map 变得迟钝的时候。上面的国家/城市名称加载非常缓慢,在移动 map 时严重滞后......我不知道为什么,我在弹出 MapFragment
时没有做任何事情。
有趣的是,它会在按下 home 按钮然后再次返回到应用程序时得到修复...
我做错了什么?
感谢您的任何想法。
最佳答案
我已经运行了一个简单的测试:
public class MapFragmentOnBackStackExample extends FragmentActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.map_fragment_on_back_stack_example);
FragmentManager fm = getSupportFragmentManager();
Fragment f = fm.findFragmentById(R.id.fragment_container);
if (f == null) {
f = SupportMapFragment.newInstance();
FragmentTransaction transaction = fm.beginTransaction();
transaction.add(R.id.fragment_container, f);
transaction.commit();
}
}
public void onAddFragmentClick(View view) {
FragmentManager fm = getSupportFragmentManager();
FragmentTransaction transaction = fm.beginTransaction();
transaction.replace(R.id.fragment_container, new MyFragment());
transaction.addToBackStack(null);
transaction.commit();
}
public static class MyFragment extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
TextView textView = new TextView(getActivity());
textView.setText("MyFragment: " + hashCode());
return textView;
}
}
}
而且看不出有什么问题。
在评论 if (f == null) {
时我可以看到问题,让它始终在旋转时创建新 fragment ,这显然是错误的,但这会引起一些怀疑。
能否同时在内存中看到1个以上的MapFragment?尝试使用 Eclipse 内存分析器 (MAT)。
关于android - 从堆栈中弹出 fragment 后,Google Maps v2 滞后,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16265346/
我是一名优秀的程序员,十分优秀!