2013-06-25 11 views
5

Zuerst, Entschuldigung für mein schlechtes Englisch, ich bin Portugiesisch Lautsprecher und sicherlich werde ich einige Englisch Grammatik Fehler machen.AscyncTask - Nicht auf dem Hauptthread

Nun, ich versuche, eine AsyncTask Klasse zu tun, um eine Karte von googleMap zu laden, aber es zeigt diese Fehlermeldung:

06-25 18:47:03.062: E/AndroidRuntime(8021): FATAL EXCEPTION: AsyncTask #1 
06-25 18:47:03.062: E/AndroidRuntime(8021): java.lang.RuntimeException: An error occured while executing doInBackground() 
06-25 18:47:03.062: E/AndroidRuntime(8021):  at java.lang.Thread.run(Thread.java:856) 
06-25 18:47:03.062: E/AndroidRuntime(8021): Caused by: java.lang.IllegalStateException: Not on the main thread 

Meine Hauptklasse, was die AsyncTask Klasse

public class ExemploGPSSimples extends FragmentActivity { 

    protected GoogleMap map; 

    @Override 
    protected void onCreate(Bundle arg0) { 
     super.onCreate(arg0); 
     setContentView(R.layout.exmeplo_gps); 
    } 

    @Override 
    protected void onResume() { 
     super.onResume(); 
     configuraGPS(); 
    } 

    private void configuraGPS() { 
     SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager() 
       .findFragmentById(R.id.fragment_gps); 
     map = mapFragment.getMap(); 
     map.setMapType(GoogleMap.MAP_TYPE_HYBRID); 
     //LatLng local=pegaPosicaoAtual(); 
     Localizador localizador = new Localizador(this); 
     String endereco="Av. João Pessoa, 1091, Porto Alegre, RS"; 
     LatLng local = localizador.getEndereco(endereco); 
     SincronizaMapa sincronizaMapa = new SincronizaMapa(this,local,map); 
     sincronizaMapa.execute(); 
     adicionaMarcador(map,local); 
     map.setMyLocationEnabled(true);  
    } 

    private void adicionaMarcador(GoogleMap map2, LatLng local) { 
     MarkerOptions markerOptions = new MarkerOptions(); 
     markerOptions.position(local).title("Luiz").snippet("Casa"); 
     Marker marker = map2.addMarker(markerOptions); 
    } 


} 
ruft

und schließlich die AsyncTask Klasse

public class SincronizaMapa extends AsyncTask<Void, Void, Void> { 

    private final Activity activity; 
    private final LatLng local; 
    private final GoogleMap map; 
    private ProgressDialog progressDialog; 

    public SincronizaMapa(Activity activity, LatLng local, 
      GoogleMap map) { 
       this.activity = activity; 
       this.local = local; 
       this.map = map; 

    } 

    @Override 
    protected void onPreExecute() { 
     progressDialog = ProgressDialog.show(activity, "Sincronizando mapa", "Aguarde...",true,true); 
    } 

    @Override 
    protected Void doInBackground(Void... params) { 
     CameraPosition position = new CameraPosition.Builder() 
     .target(local) 
     .bearing(0) 
     .tilt(0) 
     .zoom(17) 
     .build(); 
     CameraUpdate update = CameraUpdateFactory.newCameraPosition(position); 
     map.animateCamera(update); 
     return null; 
    } 

    @Override 
    protected void onPostExecute(Void result) { 
     progressDialog.dismiss(); 
    } 

} 

Vielen Dank für die Unterstützung.

+1

Keine Sorge; dein Englisch ist ausgezeichnet. Besser als viele Amerikaner, IMHO. –

Antwort

8

map.animate ändert eine UI-Komponente (die Karte), sodass dies im UI-Thread erfolgen muss. Sie können Code, der auf dem UInthread sein muss, auf OnPostExecute verschieben

+1

Außerdem würde ich sagen, dass hier keine asynctask benötigt wird, weil es keine schwere Verarbeitung in der doInBackground-Methode gibt! – Gomino

5

Das Problem besteht darin, dass Sie versuchen, die Benutzeroberfläche von einem anderen Thread als dem UI-Thread zu aktualisieren. Mit asyncTasks können Sie im Hintergrund arbeiten (doInBackgroud), während Sie den UI-Thread freihalten und dann die Benutzeroberfläche entsprechend aktualisieren (onPostExecute).

Sie sollten den Hauptteil von doInBackground in den Hauptteil von onPostExecute einfügen - die Methode, die auf dem UI-Thread ausgeführt wird.

Verwandte Themen