AscyncTask - 不在主线程上

5

首先,很抱歉我的英语不好,我讲葡萄牙语,肯定会犯一些英语语法错误。

好的,我正在尝试做一个AsyncTask类,从googleMap加载地图,但它显示这个错误消息:

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

我的主类调用了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);
    }


}

最后是AsyncTask类。

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

}

感谢大家的帮助。

1
不用担心,你的英语很好。在我看来比许多美国人都要好。 - Edward Falk
2个回答

8

map.animate 修改了一个 UI 组件(地图),因此必须在 UI 线程上执行。您可以将需要在 UI 线程上运行的代码移动到 onPostExecute 中。


1
此外,我想说这里不需要使用异步任务,因为doInBackground方法中没有繁重的处理! - Gomino

5
问题在于您正在尝试从非UI线程更新UI。asyncTasks允许您在保持UI线程空闲的同时进行后台工作(doInBackground),然后相应地更新UI(onPostExecute)。
您应该将doInBackground的主体放在onPostExecute的主体中 - 该方法在UI线程上运行。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接