2013-06-25 28 views
5

Đầu tiên, xin lỗi vì tiếng anh xấu của tôi, tôi là người nói tiếng Bồ Đào Nha và chắc chắn tôi sẽ phạm một số sai lầm ngữ pháp tiếng Anh.AscyncTask - Không phải trên chủ đề chính

Vâng, tôi đang cố gắng để làm một lớp AsyncTask để tải bản đồ từ googlemap, nhưng nó hiển thị thông báo lỗi này:

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 

lớp chính của tôi những gì gọi là lớp 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); 
    } 


} 

và cuối cùng là lớp 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(); 
    } 

} 

Cảm ơn tất cả vì đã trợ giúp.

+1

Đừng lo lắng; tiếng Anh của bạn thật xuất sắc. Tốt hơn nhiều người Mỹ, IMHO. –

Trả lời

8

map.animate sửa đổi thành phần giao diện người dùng (bản đồ), do đó phải được thực hiện trên chuỗi giao diện người dùng. Bạn có thể di chuyển mã cần phải nằm trên chuỗi giao diện người dùng đến onPostExecute

+1

Bên cạnh đó tôi sẽ nói rằng không cần thiết cho một asynctask ở đây, bởi vì không có xử lý nặng trong phương thức doInBackground! – Gomino

5

Vấn đề là bạn đang cố gắng cập nhật giao diện người dùng từ một chuỗi khác với chuỗi giao diện người dùng. asyncTasks cho phép bạn thực hiện công việc nền (doInBackgroud) trong khi vẫn giữ nguyên chuỗi giao diện người dùng và sau đó cập nhật giao diện người dùng accodingly (onPostExecute).

Bạn nên đặt phần thân của doInBackground trong phần thân của onPostExecute - phương thức chạy trên chuỗi giao diện người dùng.

Các vấn đề liên quan