2011-08-25 5 views
0

J'essaie de créer un MapView sur un autre thread, car il faut trop de temps pour charger une activité.Android: Créer MapView sur Asynctask ne fonctionne pas

class MapCreation extends AsyncTask<Integer, Void, MapView> 
{ 
    MapActivity context; 

    public MapCreation(MapActivity context) 
    { 
     this.context = context; 
    } 

    @Override 
    protected MapView doInBackground(Integer... params) 
    { 
     ListView someListView = new ListView(context); //Completely fine! 
     MapView someMapView = new MapView(context, OMITTED_KEY); //!!!!CRASH!!!! 
     return someMapView; 
    } 

    protected void onPostExecute(MapView someMapView) 
    { 
      //do something 
    } 
} 

Le programme arrête à "ThreadPoolExecutor.class" à:

} finally { 
    processWorkerExit(w, completedAbruptly); 
} 

Note: Je ne sais au sujet de la limite MapActivity/MapView de 1 instance par processus. Je n'ai pas créé un objet MapView avant d'exécuter cette asyncTask.

+0

Vous ne pouvez pas modifier l'interface utilisateur de toute discussion autre que UIThread. –

+0

Alors, comment puis-je créer un ListView (sous-classe de ViewGroup) dans ce nouveau thread ainsi que d'autres types de vues, mais je ne peux pas créer un MapView (sous-classe de ViewGroup) dans ce nouveau thread? – ninjaneer

+0

Parce que vous avez créé le 'RelativeLayout' sur le Thread UI. (Appelé' setContentView() ') alors maintenant vous allez ajouter une View à ce' RelativeLayout' d'un autre 'Thread' ajouter' MapView' dans 'onPostExecute (MapView someMapView) ' –

Répondre

-1

D'abord, je pense que vous avez besoin au moins pour obtenir la clé de débogage pour la carte, sinon vous obtiendrez juste un écran vide

alors si vous lisez plus sur constructeur

public MapView(android.content.Context context, 
      java.lang.String apiKey) 

Constructs a MapView object. 

Parameters: 
    context - A MapActivity object. 
    apiKey - A Google Maps API Key. See Obtaining a Maps API Key for complete information. 
Throws: 
    java.lang.IllegalArgumentException - **if the enclosing context is not an instance of MapActivity.** 

La carte doit étendre la MapActivity.

+0

OMITTED_KEY == clé de débogage que j'ai omise. En outre, je passe déjà un objet MapActivity au constructeur qui est une sous-classe du contexte nécessaire. – ninjaneer

0

Je gonfle la carte à partir d'un fichier XML et je la pousse dans un conteneur de disposition.

public void run() { try {

    MapsInitializer.initialize(activityHost); 

        LayoutInflater inflater = (LayoutInflater) activityHost.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
        mapView = (MapView) inflater.inflate(R.layout.map, mapView, true); 

        mapContainer.addView(mapView); 
        mapView.onCreate(null); 
        mapView.onResume(); 

        googleMap = mapView.getMap(); 
        if (googleMap == null) 
         return; 

        googleMap.setMyLocationEnabled(false); 
        googleMap.animateCamera(CameraUpdateFactory.newLatLngZoom(mapLocation, 15.0f)); 
        googleMap.getUiSettings().setZoomControlsEnabled(false); 
        googleMap.getUiSettings().setAllGesturesEnabled(false); 


       } catch (GooglePlayServicesNotAvailableException e) { 
        Log.e("ERROR", "ERROR - failed to create map"); 
        return; 
       } 
      } 
     } 

et la carte xml:

<com.google.android.gms.maps.MapView 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:map="http://schemas.android.com/apk/res-auto" 
    android:id="@+id/some_id" 
    android:layout_width="fill_parent" 
    android:layout_height="100dp" 
    android:apiKey="YOUR_ID" 
    android:visibility="visible" 
    /> 
Questions connexes