2013-06-25 17 views
5

In primo luogo, mi dispiace per il mio pessimo inglese, sono un relatore portoghese e sicuramente farò un errore di grammatica inglese.AscyncTask - Non sul thread principale

Beh, sto cercando di fare una classe AsyncTask per caricare una mappa da googleMap, ma sta mostrando questo messaggio di errore:

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 

mia classe principale quello chiama la classe AsyncTask

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); 
    } 


} 

e, infine, la classe

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(); 
    } 

} 

AsyncTask Grazie a tutti per l'aiuto.

+1

Non preoccuparti; il tuo inglese è eccellente. Meglio di molti americani, IMHO. –

risposta

8

map.animate modifica un componente dell'interfaccia utente (la mappa), quindi deve essere eseguito sul thread dell'interfaccia utente. È possibile spostare il codice che deve essere sul thread dell'interfaccia utente per onPostExecute

+1

Inoltre, direi che non c'è bisogno di un asynctask qui, perché non c'è elaborazione pesante nel metodo doInBackground! – Gomino

5

Il problema è che si sta tentando di aggiornare l'interfaccia utente da un thread diverso dal thread dell'interfaccia utente. asyncTasks consente di eseguire operazioni in background (doInBackgroud) mantenendo il thread dell'interfaccia utente libero e quindi di aggiornare l'interfaccia utente in modo accodingly (onPostExecute).

È necessario inserire il corpo di doInBackground nel corpo di onPostExecute, il metodo che viene eseguito sul thread dell'interfaccia utente.

Problemi correlati