Cómo devolver datos desde asynctask

tengo una clase extiende asynctask

private class taskMK extends AsyncTask<Void,Void,JSONObject>{
        String url;
        JSONObject json;
        public taskMK(String tr){
            this.url = tr;
        }
        @Override
        protected JSONObject doInBackground(Void... params) {
            JSONParser jsonParser = new JSONParser();
            JSONObject json = jsonParser.getJSONFromURL(url);
            return json;
        }

        @Override
        protected void onPostExecute(JSONObject result) {
            this.json = result;
        }

        @Override
        protected void onPreExecute() {
            // TODO Auto-generated method stub
            super.onPreExecute();
        }
        public JSONObject getkq(){
            return this.json;
        }

    }

En actividad

String url = "https://maps.googleapis.com/maps/api/place/search/json?location="+lat+"%2C"+lng+"&name=atm&radius="+bk+"&sensor=false&key=AIzaSyCxaZYo1zJ_QxuNcp5dL5P0xm5XvIJPXRw";
taskMK mk = new taskMK(url);
mk.execute();
JSONObject json = mk.getkq();

Tengo la intención de poner este código en la clase asynctask, pero aparece el error "No se puede crear un controlador dentro del hilo que no haya llamado a Looper.prepare ()" ... En realidad, no sé cómo resolver esto.

    Double lat = loc.getLatitude();
    Double lng = loc.getLongitude();
    String url = "https://maps.googleapis.com/maps/api/place/search/json?location="+lat+"%2C"+lng+"&name=atm&radius="+bk+"&sensor=false&key=AIzaSyCxaZYo1zJ_QxuNcp5dL5P0xm5XvIJPXRw";

    JSONParser jsonParser = new JSONParser();
    JSONObject json = jsonParser.getJSONFromURL(url);
    marker=getResources().getDrawable(R.drawable.hoe);
    itemizedOverlay = new MarkerATM(marker, mapView);
    int i=0;
    try{
        JSONArray array_atm = json.getJSONArray("results");
        for(i=0;i<array_atm.length();i++){
            JSONObject c = array_atm.getJSONObject(i);
            String atm_name = c.getString("name");
            String atm_address = c.getString("vicinity");

            JSONObject geometry  = c.getJSONObject("geometry");
            JSONObject location = geometry.getJSONObject("location");
            String atm_lat = location.getString("lat");
            String atm_lng = location.getString("lng");

            Double _lat = Double.parseDouble(atm_lat)*1E6;
            Double _lng = Double.parseDouble(atm_lng)*1E6;

            GeoPoint myPoint = new GeoPoint(_lat.intValue(), _lng.intValue());
            OverlayItem overlayItem = new OverlayItem(myPoint, atm_name, atm_address);
            itemizedOverlay.addOverlay(overlayItem);                            
        }
    }   catch(JSONException e){
        e.printStackTrace();
    }
    mapOverlays.add(itemizedOverlay);

quiero obtener datos de taskMK pero los datos siempre devuelven un valor nulo... cómo hacerlo resolví mi problema :(... lo siento, no uso bien el inglés.

preguntado el 12 de junio de 12 a las 17:06

3 Respuestas

En lugar de usar getkq() en la taskMK clase puedes tener una setkq() en la clase de actividad que está ejecutando asyncTask. Así que usa lo siguiente:

private class taskMK extends AsyncTask<Void,Void,JSONObject>{
    String url;
    JSONObject json;
    MyActivityClassObject obj;

    public taskMK(String tr, MyActivityClassObject obj){
        this.url = tr;
        this.obj = obj;
    }
    @Override
    protected JSONObject doInBackground(Void... params) {
        JSONParser jsonParser = new JSONParser();
        JSONObject json = jsonParser.getJSONFromURL(url);
        return json;
    }

    @Override
    protected void onPostExecute(JSONObject result) {
        this.obj.setkq(result);
    }

    @Override
    protected void onPreExecute() {
        // TODO Auto-generated method stub
        super.onPreExecute();
    }
}

Y en su clase de actividad puede tener esta función:

public void setkq(JSONObject obj){
        //Add your parsing logic here
    }

Respondido el 12 de junio de 12 a las 18:06

Esto sucede porque AsyncTask es un subproceso. Va a hacer sus cosas por su cuenta y cuando llames JSONObject json = mk.getkq(); AsyncTask probablemente no terminará con su tarea, por lo que devolverá el valor nulo.

Dependiendo de lo que desee hacer con su archivo, es posible que desee mostrar algunos datos que analizó de su archivo JSON. Si desea cambiar la interfaz de usuario de alguna manera. deberías hacerlo en onPostExecute()

Respondido el 12 de junio de 12 a las 18:06

En lugar de molestarme con AsyncTask, usaría un IntentService, enviaría un Intent con el trabajo que desea hacer para iniciarlo y enviaría un Intent de regreso a su Actividad cuando haya terminado.

Respondido el 12 de junio de 12 a las 18:06

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.