热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

从backstack返回时,GoogleMapsv2MapFragment非常滞后

如何解决《从backstack返回时,GoogleMapsv2MapFragment非常滞后》经验,是哪儿的问题?

我正在开发一个使用v2的应用程序,MapFragment我遇到了非常奇怪的行为.我已经创建了一个子类MapFragment来处理一些自定义行为(处理Markers,调整菜单选项等),并在第一次加载它时所有工作都很漂亮.然后我将一个新片段嵌入到我的活动中,将自定义推MapFragment到了后台上.然而,当我从后台堆栈返回地图时,事情变得奇怪; 平移地图变得极其迟钝(我们正在谈论~1 FPS),无论是手动拖动/缩放还是通过点击引脚引起的动画.而如果我与溢出菜单的任何部分进行交互,即使只是打开它并再次解除它,滞后会立即清除.似乎没有别的东西可以解决它(没有关闭/重新打开应用程序); 与非溢出菜单项进行交互,导航抽屉没有任何帮助.我从来没有见过这样的东西,也找不到之前描述过类似问题的人.任何想法,建议和/或修复都将受到欢迎.

在被问到之前回答几个问题:

是的,我正在调用super我覆盖的所有生命周期方法的版本(onCreate(),onCreateView()[我还返回超级返回的那个],以及onDestroyView()).

据我所知,我正在清理地图.每次刷新引脚时,我都会调用remove()它们,然后clean()在地图上调用,我也会这样做onDestroyView().

最后,作为参考,这是添加新片段的代码:

getFragmentManager().beginTransaction().replace(R.id.main_content_container, new JoinGroupFragment()).addToBackStack(null).commit();

当我完成它时,我只是打电话给:

getFragmentManager().popBackStack();

编辑:我不确定它会有多大帮助,但这是习惯MapFragment:

public class CustomMapFragment extends MapFragment {

    private static final String DIALOG_TAG = "CUSTOM_MAP_FRAGMENT_DIALOG";
    private static final int DEFAULT_ZOOM = 14;
    private static final int MARKER_ZOOM = 15;
    private static final int DEFAULT_PADDING = 80;
    private static final int ORANGE_THRESHOLD_MINUTES = 7;
    private static final int BLUE_THRESHOLD_MINUTES = 20;

    public static final String KEY_GROUP_NAME = "GROUP_NAME";
    public static final String KEY_GROUP_ID = "GROUP_ID";

    private TextView mGroupNameOverlay;
    private GoogleMap mMap;
    private ArrayList mMarkers;
    private Marker mSelectedMarker;
    private ArrayList mAllGroups;
    private Group mCurrentGroup;
    private ArrayList mAllLocations;
    private boolean mMapReady;
    private String mUsername;
    private boolean mCenterOnUser;

    public CustomMapFragment() {

    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setHasOptionsMenu(true);

        mMarkers = new ArrayList<>();
        mAllLocatiOns= new ArrayList<>();

        SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getActivity());
        mUsername = prefs.getString(PreferenceUtils.KEY_USERNAME, null);
        mCenterOnUser= prefs.getBoolean(PreferenceUtils.KEY_CENTER_ON_ME, false);
        mSelectedMarker = null;
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        ViewGroup view = (ViewGroup)super.onCreateView(inflater, container, savedInstanceState);

        if (view != null) {
            // View should never be null; MapFragments have a FrameLayout as their top level parent
            mGroupNameOverlay = (TextView)inflater.inflate(R.layout.group_name_overlay, view, false);
            view.addView(mGroupNameOverlay);
        }

        Bundle results = ((MainActivity)getActivity()).getFragmentResults();
        if (results != null) {
            String name = results.getString(KEY_GROUP_NAME);
            String id = results.getString(KEY_GROUP_ID);
            if (!StringUtils.isNullOrEmpty(name) && !StringUtils.isNullOrEmpty(id)) {
                mCurrentGroup = new Group(name, id);
                mAllGroups.add(mCurrentGroup);
            }
        }

        if (mCurrentGroup != null) {
            updateGroupNameOverlay(mCurrentGroup.getGroupName());
        }

        getMapAsync(new OnMapReadyCallback() {
            @Override
            public void onMapReady(GoogleMap googleMap) {
                mMap = googleMap;
                mMap.setOnMarkerClickListener(new GoogleMap.OnMarkerClickListener() {
                    @Override
                    public boolean onMarkerClick(Marker marker) {
                        mSelectedMarker = marker;
                        getActivity().invalidateOptionsMenu();
                        return false;
                    }
                });
                mMap.setOnMapClickListener(new GoogleMap.OnMapClickListener() {
                    @Override
                    public void onMapClick(LatLng latLng) {
                        mSelectedMarker = null;
                        getActivity().invalidateOptionsMenu();
                    }
                });
                populateMap(true, false);
            }
        });

        GetGroupsRequest request = new GetGroupsRequest();
        request.setListener(new GetGroupsRequestListener());
        RequestProcessor.getInstance(getActivity()).queueRequest(request);

        return view;
    }

    @Override
    public void onDestroyView() {
        mSelectedMarker = null;
        for (Marker marker : mMarkers) {
            marker.remove();
        }
        mMarkers.clear();
        mMap.clear();
        mMap = null;
        mMapReady = false;
        super.onDestroyView();
    }

    @Override
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
        if (mSelectedMarker == null) {
            inflater.inflate(R.menu.menu_map, menu);
        }
        else {
            inflater.inflate(R.menu.menu_marker, menu);
        }
        super.onCreateOptionsMenu(menu, inflater);
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case R.id.map_menu_refresh_pins:
                performLocationsRequest(false);
                return true;
            case R.id.map_menu_recenter_zoom:
                populateMap(true, true);
                return true;
            case R.id.map_menu_select_group:
                DialogFragment selectDialog = new DialogFragment() {

                    @Override
                    public Dialog onCreateDialog(Bundle savedInstanceState) {
                        String[] groups = new String[mAllGroups.size()];
                        for (int i = 0; i  1) {
                LatLngBounds.Builder builder = new LatLngBounds.Builder();
                for (Location location : mAllLocations) {
                    mMarkers.add(addMarker(location));
                    if (mCenterOnUser) {
                        if (location.getUsername().equals(mUsername)) {
                            update = CameraUpdateFactory.newLatLngZoom(new LatLng(location.getLatitude(), location.getLongitude()), DEFAULT_ZOOM);
                        }
                    }
                    else {
                        builder.include(new LatLng(location.getLatitude(), location.getLongitude()));
                    }
                }
                if (!mCenterOnUser) {
                    update = CameraUpdateFactory.newLatLngBounds(builder.build(), DEFAULT_PADDING);
                }
            }

            if (update != null && zoom) {
                if (animate) {
                    mMap.animateCamera(update);
                }
                else {
                    mMap.moveCamera(update);
                }
            }
        }
    }

    private Marker addMarker(Location location) {
        String timestamp;
        long minutesOld = (new Date().getTime() - location.getLastReported()) / 60000;
        float hue = BitmapDescriptorFactory.HUE_RED;
        if (minutesOld <1) {
            timestamp = getString(R.string.map_timestamp_just_now);
        }
        else if (minutesOld <2) {
            timestamp = getString(R.string.map_timestamp_one_minute);
        }
        else {
            timestamp = getString(R.string.map_timestamp_n_minutes, minutesOld);
            if (minutesOld >= ORANGE_THRESHOLD_MINUTES) {
                hue = BitmapDescriptorFactory.HUE_ORANGE;
            }
            if (minutesOld >= BLUE_THRESHOLD_MINUTES) {
                hue = BitmapDescriptorFactory.HUE_BLUE;
            }
        }
        LatLng latLng = new LatLng(location.getLatitude(), location.getLongitude());
        return mMap.addMarker(new MarkerOptions()
                .position(latLng)
                .icon(BitmapDescriptorFactory.defaultMarker(hue))
                .title(location.getUsername())
                .snippet(timestamp));
    }

    private class GetGroupsRequestListener extends RequestListener {

        public GetGroupsRequestListener() {
            super(getActivity());
        }

        @Override
        protected void onRequestComplete(GetGroupsResponse response) {
            mAllGroups = response.getGroups();
            if (mAllGroups.size() > 0) {
                if (mCurrentGroup == null) {
                    mCurrentGroup = mAllGroups.get(0);
                    updateGroupNameOverlay(mCurrentGroup.getGroupName());
                }
                performLocationsRequest(true);
            }
        }
    }

    private class GetLocationsRequestListener extends RequestListener {

        private boolean mmAutoZoom;

        public GetLocationsRequestListener(boolean autoZoom) {
            super(getActivity());
            mmAutoZoom = autoZoom;
        }

        @Override
        protected void onRequestComplete(GetLocationsResponse response) {
            mAllLocatiOns= response.getLocations();
            getActivity().runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    populateMap(mmAutoZoom, false);
                }
            });
        }
    }
}

PS我意识到这可能不是最好的做法来劫持视图创建并以这种方式注入我自己的叠加层,但是为了它的价值,我尝试将该部分评论出去并且它没有解决问题,所以我是怀疑它是否相关.


推荐阅读
  • 微软头条实习生分享深度学习自学指南
    本文介绍了一位微软头条实习生自学深度学习的经验分享,包括学习资源推荐、重要基础知识的学习要点等。作者强调了学好Python和数学基础的重要性,并提供了一些建议。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 本文介绍了Java高并发程序设计中线程安全的概念与synchronized关键字的使用。通过一个计数器的例子,演示了多线程同时对变量进行累加操作时可能出现的问题。最终值会小于预期的原因是因为两个线程同时对变量进行写入时,其中一个线程的结果会覆盖另一个线程的结果。为了解决这个问题,可以使用synchronized关键字来保证线程安全。 ... [详细]
  • IjustinheritedsomewebpageswhichusesMooTools.IneverusedMooTools.NowIneedtoaddsomef ... [详细]
  • 模板引擎StringTemplate的使用方法和特点
    本文介绍了模板引擎StringTemplate的使用方法和特点,包括强制Model和View的分离、Lazy-Evaluation、Recursive enable等。同时,还介绍了StringTemplate语法中的属性和普通字符的使用方法,并提供了向模板填充属性的示例代码。 ... [详细]
  • 纠正网上的错误:自定义一个类叫java.lang.System/String的方法
    本文纠正了网上关于自定义一个类叫java.lang.System/String的错误答案,并详细解释了为什么这种方法是错误的。作者指出,虽然双亲委托机制确实可以阻止自定义的System类被加载,但通过自定义一个特殊的类加载器,可以绕过双亲委托机制,达到自定义System类的目的。作者呼吁读者对网上的内容持怀疑态度,并带着问题来阅读文章。 ... [详细]
  • HashMap的相关问题及其底层数据结构和操作流程
    本文介绍了关于HashMap的相关问题,包括其底层数据结构、JDK1.7和JDK1.8的差异、红黑树的使用、扩容和树化的条件、退化为链表的情况、索引的计算方法、hashcode和hash()方法的作用、数组容量的选择、Put方法的流程以及并发问题下的操作。文章还提到了扩容死链和数据错乱的问题,并探讨了key的设计要求。对于对Java面试中的HashMap问题感兴趣的读者,本文将为您提供一些有用的技术和经验。 ... [详细]
  • 超级简单加解密工具的方案和功能
    本文介绍了一个超级简单的加解密工具的方案和功能。该工具可以读取文件头,并根据特定长度进行加密,加密后将加密部分写入源文件。同时,该工具也支持解密操作。加密和解密过程是可逆的。本文还提到了一些相关的功能和使用方法,并给出了Python代码示例。 ... [详细]
  • 本文详细介绍了使用C#实现Word模版打印的方案。包括添加COM引用、新建Word操作类、开启Word进程、加载模版文件等步骤。通过该方案可以实现C#对Word文档的打印功能。 ... [详细]
  • 带添加按钮的GridView,item的删除事件
    先上图片效果;gridView无数据时显示添加按钮,有数据时,第一格显示添加按钮,后面显示数据:布局文件:addr_manage.xml<?xmlve ... [详细]
  • MySQL多表数据库操作方法及子查询详解
    本文详细介绍了MySQL数据库的多表操作方法,包括增删改和单表查询,同时还解释了子查询的概念和用法。文章通过示例和步骤说明了如何进行数据的插入、删除和更新操作,以及如何执行单表查询和使用聚合函数进行统计。对于需要对MySQL数据库进行操作的读者来说,本文是一个非常实用的参考资料。 ... [详细]
  • 深入理解Java虚拟机的并发编程与性能优化
    本文主要介绍了Java内存模型与线程的相关概念,探讨了并发编程在服务端应用中的重要性。同时,介绍了Java语言和虚拟机提供的工具,帮助开发人员处理并发方面的问题,提高程序的并发能力和性能优化。文章指出,充分利用计算机处理器的能力和协调线程之间的并发操作是提高服务端程序性能的关键。 ... [详细]
  • 本文介绍了使用C++Builder实现获取USB优盘序列号的方法,包括相关的代码和说明。通过该方法,可以获取指定盘符的USB优盘序列号,并将其存放在缓冲中。该方法可以在Windows系统中有效地获取USB优盘序列号,并且适用于C++Builder开发环境。 ... [详细]
  • Summarize function is doing alignment without timezone ?
    Hi.Imtryingtogetsummarizefrom00:00otfirstdayofthismonthametric, ... [详细]
  • 本文介绍了使用readlink命令获取文件的完整路径的简单方法,并提供了一个示例命令来打印文件的完整路径。共有28种解决方案可供选择。 ... [详细]
author-avatar
coffee_陈--嘉辉
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有