[RESOLVIDO] Erro ao acessar classe AsyncTask

2 respostas
kmunga

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

}

Obrigado

2 Respostas

Marky.Vasconcelos

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.

kmunga

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


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


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.

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.

Criado 25 de junho de 2013
Ultima resposta 26 de jun. de 2013
Respostas 2
Participantes 2