MapFragment: плохая производительность после использования кнопки «Назад»

У меня проблема с производительностью при использовании MapFragment вместе с меню панели действий.

Ошибка возникает при выполнении трех условий

  1. Создайте экземпляр MapFragment.
  2. Запустите транзакцию фрагмента из меню параметров, заменив фрагмент карты другим фрагментом.
  3. Нажмите кнопку «Назад» и вернитесь к фрагменту карты. Теперь производительность заметно ухудшилась. Панорамирование и масштабирование очень рывками.

Повторное открытие меню параметров и его повторное закрытие устраняет проблему.

Поведение не возникает, когда

  • Запуск замены фрагмента с помощью кнопки просмотра, а не из меню параметров.
  • Запуск замены фрагмента прямо в onCreate()
  • замена пустого фрагмента на MapFragment из меню параметров
  • вызов popBackStack из меню опций
  • использование ListFragment вместо MapView

Минимальный рабочий пример (требуется доступ к Google Maps API):

import android.app.Activity;
import android.app.Fragment;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;

import com.google.android.gms.maps.MapFragment;

public class MapFragmentBugActivity extends Activity {
    Fragment mMapFragment;
    String MAP = "Map";
    String BLANK = "Blank";

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_fragment_bug);
        mMapFragment = new MapFragment();
        getFragmentManager().beginTransaction()
                .replace(R.id.main, mMapFragment)
                .commit();
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        menu.add(MAP);
        menu.add(BLANK);
        return super.onCreateOptionsMenu(menu);
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        Fragment fragment;

        if (item.getTitle().equals(MAP)) {
            fragment = mMapFragment;
        } else {
            fragment = new Fragment();
        }

        getFragmentManager()
                .beginTransaction()
                .replace(R.id.main, fragment)
                .addToBackStack(null)
                .commit();

        return true;
    }
}

План действий, ничего особенного

<?xml version="1.0" encoding="utf-8"?>

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/main"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:clickable="true" />

person Otto Allmendinger    schedule 07.08.2014    source источник
comment
Кажется, это то же самое, что описано здесь: stackoverflow.com/questions/21516008/. Таким образом, кажется, что скрытие карты, хотя на ней есть какой-либо диалог, приводит к такому поведению. Было бы интересно, поможет ли предложение Маниша в вашем случае. В моем случае, когда карта находится в галерее, я не вижу, как это реализовать.   -  person user2808624    schedule 13.08.2014


Ответы (1)


Транзакция фрагмента выполняется до закрытия меню параметров, что приводит к странному поведению.

Вместо того, чтобы напрямую выполнять транзакцию фрагмента, опубликуйте ее в файле Handler. Как только меню параметров будет закрыто, будет выполнена транзакция фрагмента.

Попробуй это :

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    final Fragment fragment;

    if (item.getTitle().equals(MAP)) {
        fragment = mMapFragment;
    } else { 
        fragment = new Fragment();
    } 

    Handler handler = new Handler();
    handler.post(new Runnable() {

        @Override
        public void run() {
            getFragmentManager()
            .beginTransaction()
            .replace(R.id.main, fragment)
            .addToBackStack(null)
            .commit();    
        }

    });     

    return true;
}
person Manish Mulimani    schedule 12.08.2014
comment
Вы спасли мой день! Спасибо! - person Tobias Reich; 15.02.2016