[RESOLVIDO] Erro ao acessar classe AsyncTask

Bom, não consigo encontrar a solução para este erro

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 android.os.AsyncTask$3.done(AsyncTask.java:299)
06-25 18:47:03.062: E/AndroidRuntime(8021): 	at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273)
06-25 18:47:03.062: E/AndroidRuntime(8021): 	at java.util.concurrent.FutureTask.setException(FutureTask.java:124)
06-25 18:47:03.062: E/AndroidRuntime(8021): 	at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307)
06-25 18:47:03.062: E/AndroidRuntime(8021): 	at java.util.concurrent.FutureTask.run(FutureTask.java:137)
06-25 18:47:03.062: E/AndroidRuntime(8021): 	at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
06-25 18:47:03.062: E/AndroidRuntime(8021): 	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
06-25 18:47:03.062: E/AndroidRuntime(8021): 	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
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
06-25 18:47:03.062: E/AndroidRuntime(8021): 	at maps.au.i.b(Unknown Source)
06-25 18:47:03.062: E/AndroidRuntime(8021): 	at maps.ao.g.b(Unknown Source)
06-25 18:47:03.062: E/AndroidRuntime(8021): 	at maps.aj.al.b(Unknown Source)
06-25 18:47:03.062: E/AndroidRuntime(8021): 	at bcn.onTransact(SourceFile:92)
06-25 18:47:03.062: E/AndroidRuntime(8021): 	at android.os.Binder.transact(Binder.java:326)
06-25 18:47:03.062: E/AndroidRuntime(8021): 	at com.google.android.gms.maps.internal.IGoogleMapDelegate$a$a.animateCamera(Unknown Source)
06-25 18:47:03.062: E/AndroidRuntime(8021): 	at com.google.android.gms.maps.GoogleMap.animateCamera(Unknown Source)
06-25 18:47:03.062: E/AndroidRuntime(8021): 	at com.example.mapas.SincronizaMapa.doInBackground(SincronizaMapa.java:42)
06-25 18:47:03.062: E/AndroidRuntime(8021): 	at com.example.mapas.SincronizaMapa.doInBackground(SincronizaMapa.java:1)
06-25 18:47:03.062: E/AndroidRuntime(8021): 	at android.os.AsyncTask$2.call(AsyncTask.java:287)
06-25 18:47:03.062: E/AndroidRuntime(8021): 	at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
06-25 18:47:03.062: E/AndroidRuntime(8021): 	... 5 more

Codigo principal que chama a classe

package com.example.mapas;

import com.google.android.gms.maps.CameraUpdate;
import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.SupportMapFragment;
import com.google.android.gms.maps.model.CameraPosition;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.Marker;
import com.google.android.gms.maps.model.MarkerOptions;

import android.location.Location;
import android.location.LocationManager;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;

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. fulano, 913, 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);
	}

	private LatLng pegaPosicaoAtual() {
		LocationManager locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);
		Location location = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
		return new LatLng(location.getLatitude(), location.getLongitude());
	}

}

a classe AsyncTask propriamente dita

[code]
package com.example.mapas;

import android.app.Activity;
import android.app.ProgressDialog;
import android.os.AsyncTask;

import com.google.android.gms.maps.CameraUpdate;
import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.model.CameraPosition;
import com.google.android.gms.maps.model.LatLng;

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

}[/code]

Obrigado

Existem operações que só podem ser feitas na UIThread, sua stacktrace está obfuscada mas acredito que voce só pode mecher na Camera na thread principal.

Obrigado Marky, havia feito a mesma pergunta no forum stackoverflow e eles me responderam assim

[quote]
map.animate modifies a UI component (the map), so that must be done on the UI thread. You can move code that needs to be on the UI thread to onPostExecute[/quote]

[quote]
The problem is that you are trying to update the UI from a thread other than the UI thread. asyncTasks allow you to do background work (doInBackgroud) while keeping the UI thread free and then update the UI accodingly (onPostExecute).

You should put the body of doInBackground in the body of onPostExecute - the method that runs on the UI thread.[/quote]

A solução que encontrei foi mudar o

map.animateCamera(update);

para o metodo onPostExecute e funcionou. Eu inventei de criar uma classe destas pq notei que minha aplicação estava dando erro quando a conexão com a internet estava lenta, deduzi que era por causa da demora em carregar o mapa. Enfim, não tive mais problemas com o fechamento do aplicativo depois desta implementação.

Obrigado novamente.