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

getkq()クラスで使用するのではなく、asyncTask を実行しているアクティビティ クラスで使用taskMKできます。setkq()したがって、次を使用します。

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 に煩わされるのではなく、IntentService を使用し、それを開始するために必要な作業を含む Intent を送信し、完了したら Intent を Activity に送り返します。

于 2012-06-12T17:29:09.130 に答える
0

これは、AsyncTask がスレッドであるためです。JSONObject json = mk.getkq();AsyncTaskを呼び出すと、おそらく彼のタスクは完了しないため、null 値が返されます。

ファイルで何をしたいかによっては、JSON ファイルから解析したデータを表示したい場合があります。なんらかの方法で UI を変更したい場合。あなたはそれをするべきですonPostExecute()

于 2012-06-12T17:00:57.607 に答える