1

我有一个类扩展 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;
        }

    }

活动中

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

我打算将此代码放在 asynctask 类中,但出现错误“无法在未调用 Looper.prepare() 的线程内创建处理程序”...。实际上,我不知道如何解决这个问题。

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

我想从 taskMK 获取数据,但数据总是返回 null ......我怎么办我解决了我的问题 :( .. 对不起,我用英语不好。

4

3 回答 3

4

您可以在执行 asyncTask 的活动类中使用,而不是getkq()在类中使用。所以使用以下内容:taskMKsetkq()

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

在您的活动课程中,您可以使用以下功能:

public void setkq(JSONObject obj){
        //Add your parsing logic here
    }
于 2012-06-12T17:28:51.300 回答
0

这是因为 AsyncTask 是一个线程。它会自己做他的事情,当你调用JSONObject json = mk.getkq();AsyncTask 时,他的任务可能不会完成,因此返回 null 值。

根据您要对文件执行的操作,您可能希望显示从 JSON 文件中解析的一些数据。如果您想以任何方式更改 UI。你应该这样做onPostExecute()

于 2012-06-12T17:00:57.607 回答
0

我不会使用 AsyncTask,而是使用 IntentService,发送一个包含您想要完成的工作以启动它的 Intent,并在完成后将一个 Intent 发送回您的 Activity。

于 2012-06-12T17:29:09.130 回答