添加Marker后,什么会降低SupportMapFragment的速度

时间:2015-09-29 09:10:59

标签: java android google-maps google-maps-api-3

我在 SupportMapFragment 时遇到问题,并且在从另一个片段返回后加速,其中我添加了一些标记。

我的流程是: MapFragment - > AddingFragment - > AddToStaticObjectOfMarker - > MapFragment (其中一个干净的地图并从StaticObjectOfMarker重新绘制所有Marker) - 在此流程之后,地图非常慢并且几乎不可能在其上移动。

我正在考虑一些浪费能源的错误,但有趣的是,如果我锁定解锁手机,一切都很好。我正在寻找onResume(几乎整个生命周期,但没有发现任何奇怪的东西)。

锁定/解锁操作后是否会触发一些与我的问题相关的Android机制?

我没有发布我的代码,因为有大量不相关的代码 - 但如果有人需要检查某些部分,我会在此处发布。

修改 我如何改变片段:

public void changeFragment(String toFragment, Bundle args){

    Log.d(TAG, "onNavigationItemSelected");

    Fragment mCurrentFragment = getFragmentManager().findFragmentById(R.id

            .fragment_place);

    if(mCurrentFragment.getClass().getName() == toFragment){

        return;

    }

    Util.hideSoftKeyboard(this);

    Fragment fragment = getFragmentManager().findFragmentByTag(toFragment);

    if(fragment == null){

        fragment = Fragment.instantiate(this,toFragment);

        if(args != null){

            fragment.setArguments(args);

        }

        getFragmentManager().beginTransaction()

                .setCustomAnimations(

                        R.animator.fragment_slide_in, R.animator.fragment_slide_out, 0, 0)

                .replace(R.id.fragment_place,fragment)

                .addToBackStack(null)

                .commit();

    }else{

        getFragmentManager().beginTransaction()

                .setCustomAnimations(

                        R.animator.fragment_slide_in, R.animator.fragment_slide_out, 0, 0)

                .replace(R.id.fragment_place,fragment)

                .addToBackStack(null)

                .commit();

    }

}

和地图片段

private static View cachedView;

...

@Override

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

    Log.d(TAG, "cachedView is null == " + (cachedView == null));

    if (cachedView == null) {

        cachedView = super.onCreateView(inflater, container, savedInstanceState);

        mMapFragment = (SupportMapFragment) mContainingActivity.getSupportFragmentManager().findFragmentById(R.id.map);

        mMapFragment.getMapAsync(this);

    }

    Log.d(TAG, "onCreateView");

    ButterKnife.bind(this, cachedView);



    mLocationHelper.registerListener(this);



    return cachedView;

}

但是有一些更新地图的服务 - 它很复杂,我不想把它整个发布到某个地方但是如果你需要帮助我可以让你访问我的git存储库来查看整个代码。

EDIT2: 我看一下控制台的输出并得到这两条有趣的线:

 09-29 12:31:59.154    7286-7301/cz.united121.android.revizori W/art﹕ Suspending all threads took: 12.205ms
 09-29 12:31:59.207    7286-7306/cz.united121.android.revizori I/art﹕ Background sticky concurrent mark sweep GC freed 121977(4MB) AllocSpace objects, 47(2MB) LOS objects, 20% free, 21MB/27MB, paused 5.140ms total 91.364ms

锁定android挂起所有线程后?

EDIT3:

我开始使用Leak Canary并在使用我的应用程序后获得此泄漏:

10-02 09:55:54.157 4383-9459/cz.united121.android.revizori D/LeakCanary: * cz.united121.android.revizori.activity.MapActivity has leaked:
10-02 09:55:54.157 4383-9459/cz.united121.android.revizori D/LeakCanary: * GC ROOT thread com.google.maps.api.android.lib6.gmm6.n.bg.f (named 'RenderDrive')
10-02 09:55:54.157 4383-9459/cz.united121.android.revizori D/LeakCanary: * references com.google.maps.api.android.lib6.gmm6.n.bf.k
10-02 09:55:54.157 4383-9459/cz.united121.android.revizori D/LeakCanary: * references com.google.maps.api.android.lib6.gmm6.c.y.mParent
10-02 09:55:54.157 4383-9459/cz.united121.android.revizori D/LeakCanary: * references android.widget.FrameLayout.mParent
10-02 09:55:54.157 4383-9459/cz.united121.android.revizori D/LeakCanary: * references android.widget.FrameLayout.mContext
10-02 09:55:54.157 4383-9459/cz.united121.android.revizori D/LeakCanary: * leaks cz.united121.android.revizori.activity.MapActivity instance
10-02 09:55:54.157 4383-9459/cz.united121.android.revizori D/LeakCanary: * Reference Key: 85e89bca-05f0-4d7a-8982-422e138b2e15
10-02 09:55:54.157 4383-9459/cz.united121.android.revizori D/LeakCanary: * Device: motorola motorola XT1032 falcon_tescogbsl
10-02 09:55:54.157 4383-9459/cz.united121.android.revizori D/LeakCanary: * Android Version: 5.0.2 API: 21 LeakCanary: 1.3.1

我尝试将每个上下文替换为applicationContext 以避免引用activityContext,但我没有帮助 - 任何想法是什么导致这个?

1 个答案:

答案 0 :(得分:0)

希望我正在使用GIT并且我在两次提交之间跟踪问题并发现问题 - 我使用 ButterKnife 绑定我的视图,问题是我尝试使用 DialogFragment onCreateView 中的strong>和绑定视图,但我忘记 onDestroyView 中的取消绑定 ...非常愚蠢...但是我不知道绑定(也许阻止垃圾收集器是如此大的问题)

有人知道为什么会这样吗?