8
votes

Android MapView provoque toujours une émission exceptionnelle dans des éléments imbriqués

J'essaie de créer un MAPView (actuellement sans aucune superposition) dans certains éléments imbriqués. C'est fondamentalement quelque chose comme ScrollView -> RelativitAnouTout -> RelativelAnAutOut -> MapView CODE>

04-04 13:38:33.910: WARN/dalvikvm(13628): threadid=1: thread exiting with uncaught exception (group=0x40015560)
04-04 13:38:33.996: ERROR/AndroidRuntime(13628): FATAL EXCEPTION: main
04-04 13:38:33.996: ERROR/AndroidRuntime(13628): java.lang.OutOfMemoryError
04-04 13:38:33.996: ERROR/AndroidRuntime(13628):     at android_maps_conflict_avoidance.com.google.googlenav.map.Map.resize(Map.java:1368)
04-04 13:38:33.996: ERROR/AndroidRuntime(13628):     at android_maps_conflict_avoidance.com.google.googlenav.map.Map.resize(Map.java:1337)
04-04 13:38:33.996: ERROR/AndroidRuntime(13628):     at com.google.android.maps.MapView.onMeasure(MapView.java:590)
04-04 13:38:33.996: ERROR/AndroidRuntime(13628):     at android.view.View.measure(View.java:8313)
04-04 13:38:33.996: ERROR/AndroidRuntime(13628):     at android.widget.RelativeLayout.measureChildHorizontal(RelativeLayout.java:581)
04-04 13:38:33.996: ERROR/AndroidRuntime(13628):     at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:365)
04-04 13:38:33.996: ERROR/AndroidRuntime(13628):     at android.view.View.measure(View.java:8313)
04-04 13:38:33.996: ERROR/AndroidRuntime(13628):     at android.widget.RelativeLayout.measureChildHorizontal(RelativeLayout.java:581)
04-04 13:38:33.996: ERROR/AndroidRuntime(13628):     at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:365)
04-04 13:38:33.996: ERROR/AndroidRuntime(13628):     at android.view.View.measure(View.java:8313)
04-04 13:38:33.996: ERROR/AndroidRuntime(13628):     at android.widget.ScrollView.measureChildWithMargins(ScrollView.java:1072)
04-04 13:38:33.996: ERROR/AndroidRuntime(13628):     at android.widget.FrameLayout.onMeasure(FrameLayout.java:250)
04-04 13:38:33.996: ERROR/AndroidRuntime(13628):     at android.widget.ScrollView.onMeasure(ScrollView.java:296)
04-04 13:38:33.996: ERROR/AndroidRuntime(13628):     at android.view.View.measure(View.java:8313)
04-04 13:38:33.996: ERROR/AndroidRuntime(13628):     at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3138)
04-04 13:38:33.996: ERROR/AndroidRuntime(13628):     at android.widget.FrameLayout.onMeasure(FrameLayout.java:250)
04-04 13:38:33.996: ERROR/AndroidRuntime(13628):     at android.view.View.measure(View.java:8313)
04-04 13:38:33.996: ERROR/AndroidRuntime(13628):     at android.widget.LinearLayout.measureVertical(LinearLayout.java:531)
04-04 13:38:33.996: ERROR/AndroidRuntime(13628):     at android.widget.LinearLayout.onMeasure(LinearLayout.java:309)
04-04 13:38:33.996: ERROR/AndroidRuntime(13628):     at android.view.View.measure(View.java:8313)
04-04 13:38:33.996: ERROR/AndroidRuntime(13628):     at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3138)
04-04 13:38:33.996: ERROR/AndroidRuntime(13628):     at android.widget.FrameLayout.onMeasure(FrameLayout.java:250)
04-04 13:38:33.996: ERROR/AndroidRuntime(13628):     at android.view.View.measure(View.java:8313)
04-04 13:38:33.996: ERROR/AndroidRuntime(13628):     at android.view.ViewRoot.performTraversals(ViewRoot.java:839)
04-04 13:38:33.996: ERROR/AndroidRuntime(13628):     at android.view.ViewRoot.handleMessage(ViewRoot.java:1859)
04-04 13:38:33.996: ERROR/AndroidRuntime(13628):     at android.os.Handler.dispatchMessage(Handler.java:99)
04-04 13:38:33.996: ERROR/AndroidRuntime(13628):     at android.os.Looper.loop(Looper.java:123)
04-04 13:38:33.996: ERROR/AndroidRuntime(13628):     at android.app.ActivityThread.main(ActivityThread.java:3647)
04-04 13:38:33.996: ERROR/AndroidRuntime(13628):     at java.lang.reflect.Method.invokeNative(Native Method)
04-04 13:38:33.996: ERROR/AndroidRuntime(13628):     at java.lang.reflect.Method.invoke(Method.java:507)
04-04 13:38:33.996: ERROR/AndroidRuntime(13628):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
04-04 13:38:33.996: ERROR/AndroidRuntime(13628):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
04-04 13:38:33.996: ERROR/AndroidRuntime(13628):     at dalvik.system.NativeStart.main(Native Method)
04-04 13:38:34.027: WARN/ActivityManager(6000):   Force finishing activity package/.home
04-04 13:38:34.527: WARN/ActivityManager(6000): Activity pause timeout for HistoryRecord{405336d0 package/.home}


2 commentaires

Est-ce tout ce que vous pouvez voir à propos de cette exception dans le journal Cat? Semble un peu court pour toute une trace de pile d'exception. Une autre chose est que c'est un peu bizarre de mettre un MapView dans une enveloppe de défilement car vous pourriez avoir des problèmes lorsque quelqu'un veut faire défiler la carte.


Merci pour votre réponse. J'ai maintenant collé toute la cheminée. Pensé que c'est surtout des choses inutiles. Malheureusement, je dois mettre la carte de la carte dans la vision de Scroll. J'espère (lorsque la MapView a montré), je peux le modifier qu'il faut le geste de défilement lorsque l'utilisateur le fait à la vue, sinon le ScrollView doit faire défiler.


7 Réponses :


2
votes

Je ne vois pas vraiment où vous obtenez une émission exceptionnelle? Je vois ceci:

Caused by: java.lang.IllegalArgumentException: MapViews can only be created inside instances of MapActivity.


1 commentaires

Désolé, j'oublie de changer d'activité à Mapactivité. Maintenant, j'ai collé dans le code correct avec l'OutofMemoryError.



6
votes

J'ai également eu ce problème, cela se produit lorsque vous essayez de spécifier les dimensions exactes d'un MAPView. Définissez l'une des dimensions pour remplir_parent ou enveloppant_content et laissez l'autre quelle que soit la dimension souhaitée. Cela devrait faire le tour.


6 commentaires

Merci! Malheureusement, cela ne fonctionne pas pour moi. Je reçois toujours l'OutofMemoryError. La mise en page restante prend environ 8 Mo, peut-être que c'est tout simplement trop pour un MAPView.


Peut-être - je ne suis pas trop sûr. Si vous démarquez la mise en page laissant juste la carte de la carte fonctionnait-elle avec les dimensions que vous avez données?


Merci encore! Mon erreur doit être ailleurs. J'ai dépouillé ma mise en page par des objets chers (dont j'ai besoin, mais je les ai supprimés pour tester) mais je reçois toujours l'erreur d'erreur, j'ai 32 tailles de tas de mib sur mon appareil. Je ne pense pas que je ne le dépasse pas. Peut-être que MapView a quelques problèmes avec des vues souvent imbriquées :(


Une dernière option: Essayez de définir une dimension du parent immédiat de la MapView comme quel que soit le trempette et l'autre comme parent de remplissage. Définissez les deux dimensions de la carte vue elle-même à Fill_Parent


Merci encore! J'ai essayé ça, mais malheureusement, cela ne fait pas de différence.


Il semble y avoir un MemoryLeak dans la MapVieak Impléménation: code.google.com/p/androïd/issues/... startez le problème si vous pensez que cela cause votre problème.



2
votes

Regardez le thread suivant:

numéro 2181: Une fuite de mémoire dans le système lors de l'utilisation de MapView P>

semble être quelque chose d'interne dans Mapactivity. Le fil est vivant pendant plus de deux ans maintenant et il n'a pas été signalé comme fixe ... p>

Edit: essayé la solution décrite là-bas et cela m'a conduit à une solution similaire: P>

try {
        Field mConfigField = MapActivity.class.getDeclaredField("mConfig");
        mConfigField.setAccessible(true);

        Object mConfig = mConfigField.get(this);
        if (null != mConfig)
        {
            Field mConfigContextField = mConfig.getClass().getDeclaredField("context");
            mConfigContextField.setAccessible(true);

            mConfigContextField.set(mConfig, null);

            mConfigField.set(this, null);
        }

    } catch (Exception ex) {
        // Do error handling
    }


1 commentaires

La fuite est un problème légitime, mais dans ce cas, il s'agit d'un bogue instantané - différent.



0
votes

En réalité, il est causé par ScrollView Création d'un tampon pour contenir la vue à chaque position possible de la barre de défilement pour activer le défilement rapide et lisse. Étant donné qu'un MAPVIEW est assez grand lorsque les tuiles sont chargées pendant la phase de mesure, le tampon résultant créé par ScrollView peut être énorme (environ 128 m). Sauf si vous définissez votre émulateur pour avoir plus de 256 m de RAM et d'espace de tas, cela échouera avec une erreur de mémoire hors mémoire. Vous pouvez définir votre émulateur pour avoir 512m de RAM et d'espace de tas, mais votre application s'écraserait sur n'importe quel périphérique comportant 512 m de RAM ou un espace de tas insuffisant. La meilleure chose à faire est de supprimer la carteView de la vue de ScrollView.


0 commentaires

1
votes

En fait, sa cause en plaçant la carteView dans un ScrollView. Voir Android MapView provoque toujours une émission exceptionnelle dans des éléments imbriqués pour plus d'informations.


0 commentaires


11
votes

J'ai découvert quelque chose d'assez simple.

Placez simplement la carteView à l'intérieur d'un Framelayout. Laissez le framgelayout être wrap_content | wrap_content et tout va bien :) p>

Celui-ci échoue: p>

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent"
    android:layout_height="fill_parent">

    <ScrollView android:layout_width="fill_parent" android:layout_height="fill_parent">

        <RelativeLayout android:layout_width="fill_parent" android:layout_height="wrap_content">

            <FrameLayout android:layout_width="wrap_content" android:layout_height="wrap_content">

                <view android:layout_width="100dip" android:layout_height="90dip" class="com.google.android.maps.MapView"
                    android:apiKey="@string/API_KEY" android:clickable="true" />

            </FrameLayout>

        </RelativeLayout>
    </ScrollView>
</RelativeLayout>


1 commentaires

Je veux upvote votre réponse à chaque fois que je suis bloqué sur ce problème, trouvez cet article et vous sauvegardez ma journée! Mais je ne peux pas le faire. Une seule fois, désolé :)