2013-06-25 11 views
5

सबसे पहले, मेरी बुरी अंग्रेजी के लिए खेद है, मैं पुर्तगाली स्पीकर हूं और निश्चित रूप से मैं कुछ अंग्रेजी व्याकरण गलती करूंगा।AscyncTask - मुख्य धागे पर नहीं

ठीक है, मैं एक 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

चिंता न करें; आपका अंग्रेजी उत्कृष्ट है। कई अमेरिकियों से बेहतर, आईएमएचओ। –

उत्तर

8

map.animate एक यूआई घटक (मानचित्र) को संशोधित करता है, ताकि यूआई थ्रेड पर किया जाना चाहिए। आप यूआई थ्रेड पर यूपी थ्रेड पर

+1

इसके अलावा मैं कहूंगा कि यहां एसिंक्टास्क की आवश्यकता नहीं है, क्योंकि doInBackground विधि में कोई भारी प्रसंस्करण नहीं है! – Gomino

5

पर कोड को स्थानांतरित कर सकते हैं समस्या यह है कि आप यूआई थ्रेड के अलावा किसी थ्रेड से UI को अपडेट करने का प्रयास कर रहे हैं। UIyn थ्रेड को मुक्त रखते हुए asyncTasks आपको पृष्ठभूमि कार्य (doInBackgroud) करने की अनुमति देता है और उसके बाद UI को accodingly (onPostExecute) अद्यतन करता है।

आपको यूओ थ्रेड पर चलने वाली विधि - PostExecute के शरीर में doInBackground का शरीर रखना चाहिए।

संबंधित मुद्दे