IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Android Discussion :

GoogleMap bloque l'UI


Sujet :

Android

  1. #1
    Membre régulier
    Homme Profil pro
    Inscrit en
    Octobre 2012
    Messages
    172
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Octobre 2012
    Messages : 172
    Points : 70
    Points
    70
    Par défaut GoogleMap bloque l'UI
    Bonjour à tous,

    Mon application dispose d'un menu (Drawer) avec plusieurs catégories.
    Tous sont fluides au clic (change le fragment et ferme le drawer de maniere tout a fait fluide)

    Le soucis est qu'au clic sur la catégorie qui affiche la map, l'UI se bloque et pour plusieurs secondes !

    C'est plus qu'ennuyeux, seulement je ne fais pour le moment aucun traitement dessus! je ne fais que :
    - remplacer un FrameLayout par la supportMapFragment
    - puis appel à la methode getMap()

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
     
    @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
            GoogleMapOptions op = new GoogleMapOptions();
            op.zOrderOnTop(false);
            mSupportMapFragment = SupportMapFragment.newInstance(op);
            FragmentManager fm = getActivity().getSupportFragmentManager();
            FragmentTransaction ft = fm.beginTransaction();
     
            View root = inflater.inflate(R.layout.fragment_client_container, container, false);
     
            getActivity().getSupportFragmentManager().beginTransaction().add(R.id.client_container_map,
                    mSupportMapFragment).commit();
     
            return root;
        }
     
        @Override
        public void onResume() {
            super.onResume();
            setUpMap();
        }
     
        private void setUpMap() {
            if (mGoogleMap == null) {
                mSupportMapFragment.getMap();
            }
            if (mGoogleMap != null) {
                mGoogleMap.getUiSettings().setZoomControlsEnabled(false);
                mGoogleMap.setOnMarkerClickListener(this);
                mGoogleMap.setInfoWindowAdapter(mWindowAdapter);
                mGoogleMap.setOnInfoWindowClickListener(this);
                mGoogleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(46, 2), 4));
            }
        }
    J'ai essayé de remplacer getMap() par getMapAsync(OnMapReadyCallback callback) mais cela bloque toujours autant :/

    D'avance merci pour votre aide

  2. #2
    Membre régulier
    Homme Profil pro
    Inscrit en
    Octobre 2012
    Messages
    172
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Octobre 2012
    Messages : 172
    Points : 70
    Points
    70
    Par défaut
    UP ?
    Il y a forcément plein d'autres devs qui éprouvent le même soucis...
    Aucune solution à l'heure actuelle ?

  3. #3
    Membre actif Avatar de Altak
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2014
    Messages
    170
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2014
    Messages : 170
    Points : 245
    Points
    245
    Par défaut
    Bonjour,

    J'ai moi-même du intégrer une google map dans une app mais je n'ai pas eu ce probleme...
    Je ne vois pas ce qui peut clocher dans ton code mais je vais te dire comment j'ai fait et peut-être que cela t'aidera...

    J'ai creé un fragment qui contient dans son layout juste ca :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="fill_parent"
        android:layout_height="match_parent"
        android:background="@drawable/gradient_acceuil"
        android:orientation="horizontal"
        android:padding="5dp" >
     
        <com.google.android.gms.maps.MapView
            android:id="@+id/map"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />
     
    </LinearLayout>
    dans son onCreateView(), je ne fais que retourner le layout et tout mon traitement se fait dans le onViewCreated() :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    	@Override
    	public void onViewCreated(View view, Bundle savedInstanceState) {
    		// TODO Auto-generated method stub
     
    		MapsInitializer.initialize(getActivity());
     
            switch (GooglePlayServicesUtil.isGooglePlayServicesAvailable(getActivity()) )
            {
                case ConnectionResult.SUCCESS:
                    mapView = (MapView) rootView.findViewById(R.id.map);
                    mapView.onCreate(savedInstanceState);
                    // Gets to GoogleMap from the MapView and does initialization stuff
                    if(mapView!=null)
                    {
                    	googleMap = mapView.getMap();
                    	googleMap.getUiSettings().setMyLocationButtonEnabled(false);                	
                    	this.setUpMap();
                    }
                    break;
                case ConnectionResult.SERVICE_MISSING: 
                    Toast.makeText(getActivity(), "SERVICE MISSING", Toast.LENGTH_SHORT).show();
                    break;
                case ConnectionResult.SERVICE_VERSION_UPDATE_REQUIRED: 
                    Toast.makeText(getActivity(), "UPDATE REQUIRED", Toast.LENGTH_SHORT).show();
                    break;
                default: Toast.makeText(getActivity(), GooglePlayServicesUtil.isGooglePlayServicesAvailable(getActivity()), Toast.LENGTH_SHORT).show();
            }
    	}
    Et pour terminer, je surcharge le onLowMemory() et le onResume() (je ne sais plus pourquoi mais je me souviens que la surcharge du onLowMemory est importante ^^)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
        @Override
        public void onLowMemory() {
            super.onLowMemory();
            mapView.onLowMemory();
        }
     
     
    	@Override
    	public void onResume() {
    		super.onResume();
    		mapView.onResume();
    	}
    Il m'arrive parfois d'avoir une a deux seconde de délais lors de la toute première utilisation de la map mais elle se charge directement par la suite.

    Voila voilou, en espérant que cela t'aide.
    GLHF!

  4. #4
    Membre régulier
    Homme Profil pro
    Inscrit en
    Octobre 2012
    Messages
    172
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Octobre 2012
    Messages : 172
    Points : 70
    Points
    70
    Par défaut
    Salut et merci pour ta reponse

    Peut etre le fait de directement intégrer l'element map dans le .xml ?
    J'essairai ta méthode mais j'avais lu sur plusieurs forum qu'il etait plus prudent de faire un replace d'un framelayout par la map via le fragmentManager car la carte pouvait crasher dans le cas contraire...

    EDIT : tu as bien la map en mode "normal" et non "lite" ?

  5. #5
    Membre actif Avatar de Altak
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2014
    Messages
    170
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2014
    Messages : 170
    Points : 245
    Points
    245
    Par défaut
    Re,

    J'affiche la map de base, je n'ai pas touché la config.

    J'ai remarquais que j'appelai le onCreate() de la MapView qu'une fois la vue créé (dans le onViewCreated() de mon fragment).
    Cela vient peut-être de la, il sépare du coup le fait de charger le fragment et de charger la map...
    Je dois t'avouer que je ne sais pas trop, j'ai regardé plusieurs tuto et je suis arrivé a ca

    Pour le fragmentManager, tu remarquera que j'utilise une mapView et non un MapFragment.
    C'est tout a fait volontaire, j'avais eu des soucis avec le mapFragment que je n'ai pas du tout avec la mapView.

    GLHF

Discussions similaires

  1. Requête SQL qui me bloque
    Par David Guillouet dans le forum Langage SQL
    Réponses: 5
    Dernier message: 27/04/2004, 14h52
  2. Bloque la date et l'heure sous Win XP ??
    Par Djedjeridoo dans le forum Windows
    Réponses: 2
    Dernier message: 05/04/2004, 12h11
  3. Réponses: 2
    Dernier message: 23/03/2004, 12h23
  4. Réponses: 1
    Dernier message: 23/02/2004, 12h58
  5. bloqué en mode Release
    Par matsch77 dans le forum MFC
    Réponses: 3
    Dernier message: 07/01/2004, 17h17

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo