2010-11-12 7 views
3

J'ai une application qui contient une activité qui est une MapviewActivity et est principalement une carte. Cependant, j'ai remarqué que le temps de démarrage de l'activité est très lent et qu'il y a un décalage entre le moment où le bouton est enfoncé et l'activité de la carte. Je pense que cela crée une mauvaise expérience utilisateur et aimerait éviter cela. J'ai déjà mis l'arrière-plan de l'activité de la carte à @null comme suggéré par l'un des articles d'amélioration de l'interface utilisateur sur la page de développement de Google, ce qui ne me semble pas faire l'affaire.Accélérer le lancement de l'activité contenant mapview et étendre MapviewActivity

Y at-il un moyen d'améliorer cela? Je ne voudrais pas que l'écran d'accueil principal reste coincé sur le lancement de l'activité, même un transfert vers l'activité de la carte, puis le chargement de la carte serait mieux.

Merci, Jason

Répondre

8

Vous pouvez essayer de retirer le MapView de votre mise en page. Ensuite, dans onCreate(), utilisez post() pour planifier un Runnable à ajouter dans le MapView et effectuez votre initialisation liée à la carte à partir de Java. En utilisant post() (ou, potentiellement, postDelayed()) pour reporter le MapView plus loin, vous devriez être en mesure de rendre le reste de l'activité en premier.

Je n'ai pas essayé cela, donc YMMV. :-)

+0

Merci, qui a fait le tour, et merci pour votre aide que vous toujours fournir des réponses utiles – Jason

+0

@Jason: Hey, content que ça a marché. Par curiosité, 'post()' était-il suffisant, ou avez-vous fini par utiliser 'postDelayed()'? – CommonsWare

+0

Cela m'a aidé mais j'avais besoin d'utiliser postDelayed. – tomwilson

1

J'ai essayé la réponse de CommonsWare, mais il y avait un retard important à lancer même une carte MapActivity vide sans MapView. Donc, j'ai mis une autre activité au milieu, "MapLoading". Mon activité à la maison lance MapLoading, qui utilise ensuite post() pour lancer immédiatement MapActivity. En raison du décalage, l'application reste sur MapLoading pendant quelques secondes (ce qui est le résultat souhaité, par opposition à coller sur mon activité à la maison). L'activité MapLoading n'a pas d'historique définie. Par conséquent, lorsque vous cliquez sur le bouton Précédent à partir de MapActivity, l'activité se poursuit jusqu'à l'écran d'accueil. Les futurs lancements de MapActivity sont très rapides et l'activité MapLoading ne fait que clignoter à l'écran.

Voici le code pour MapLoading (l'activité avec le MapView en elle est appelée Carte):

public class MapLoading extends Activity { 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.maploading); 

     new Handler().post(new Runnable() { 
      public void run() 
      { 
       startActivity(new Intent(MapLoading.this, Map.class)); 
      } 
     }); 
    } 
} 

Voici sa mise en page:

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

    <TextView 
     android:id="@+id/maploading" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     android:gravity="center" 
     android:textSize="14pt" 
     android:text="Loading map..." 
     /> 

</RelativeLayout> 

Et la strophe correspondante AndroidManifest.xml :

<activity android:label="@string/app_name" 
      android:name="MapLoading" 
      android:noHistory="true" /> 
1

Cela m'a embêté pendant un certain temps et je l'ai travaillé en développant o J'utilise actuellement cette solution qui a accéléré considérablement le temps de chargement de mon activité et qui a fait en sorte que tout soit aussi lisse que possible.

Mon MapActivity:

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_map); // See activity_map.xml below. 

    // Start a runnable that does the entire Map setup. 
    // A delay does not seem to be necessary. 
    Handler mapSetupHandler = new Handler(); 
    Runnable mapSetupRunnable = new Runnable() { 
     public void run() { 
      FragmentManager fragMan = getSupportFragmentManager(); 
      FragmentTransaction fragTransaction = fragMan.beginTransaction(); 

      final SupportMapFragment mapFragment = new SupportMapFragment(); 
      fragTransaction.add(R.id.container_map, mapFragment, "mapFragment"); 
      fragTransaction.commit(); 

      // At the end, retrieve the GoogleMap object and the View for further setup, 
      // zoom in on a region, add markers etc. 
      mapFragment.getMapAsync(new OnMapReadyCallback() { 
       @Override 
       public void onMapReady(GoogleMap googleMap) { 
        mMap = googleMap; 
        mMapView = mapFragment.getView(); 
        setUpMap(); 
       } 
      }); 
     } 
    }; 
    mapSetupHandler.post(mapSetupRunnable); 
} 

layout/activity_map.xml:

<RelativeLayout  
xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="match_parent" 
android:layout_height="match_parent"> 

<!--This FrameLayout will be used by the GoogleMap--> 
<!--as a container for the SupportMapFragment.--> 
<FrameLayout 
    android:id="@+id/container_map" 
    android:layout_width="match_parent" 
    android:layout_height="fill_parent" 
    android:layout_above="@id/bar_room_password" 
    android:layout_below="@id/toolbar"> 

    <!--Initially the container is filled with a placeholder image.--> 
    <!--A small, heavily blurred image of a map screenshot is used--> 
    <!--in order to fake a loading map.--> 
    <ImageView 
     android:id="@+id/image_map_placeholder" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:alpha="50" 
     android:contentDescription="@string/map" 
     android:scaleType="centerCrop" 
     android:src="@drawable/placeholder_map" /> 
</FrameLayout> 

[... more, unrelated Views...] 
</RelativeLayout> 

L'activité s'affiche rapidement car le programme d'installation est géré à l'intérieur d'un Runnable. De plus, au lieu de montrer une vue vide pendant que GoogleMap fait sa configuration et ses téléchargements, je montre une fausse image vague d'une carte.

Le logo Google est placé sur le dessus du ImageView relativement tôt il semble assez convaincant avec juste une image de 128x128 pixels:

ImageView below GoogleMap in an Activity as a mock loading screen

+0

Beau tour avec l'image. – Jason