android - 从堆栈中弹出 fragment 后,Google Maps v2 滞后

标签 android android-fragments android-maps-v2

我有一个带有 MapFragmentActivity,我使用 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/

相关文章:

android - Android 中的 StrictMode 策略违规 : StrictModeDiskReadViolation, WriteViolation

java - 使用 StaggeredGridLayout 预加载毕加索图像

android - 非 UI fragment 与单例

Android资源键冲突

android - 为什么 fragment 中的生命周期方法是公开的,而 Activity 的生命周期方法是 protected ?

android - fragment 引起的屏幕旋转时 Activity 崩溃

java - Android map API V2.多边形上的地面覆盖

android - 如何从经纬度android google map v2获取地址

java - 在 Android 中避免 Toast 堆积的最佳方法

java - 带有 Urlconnection 获取请求的 FileNotFoundException