android - Google Maps API 获取 JSON 数据并将其设置为信息窗口

标签 android interface android-asynctask google-maps-api-2

我有一个有点长的问题。我现在正在学习 Google Maps API,我需要让应用程序从网站获取一些 JSON 数据,然后在信息窗口中将这些数据中的一些设置为标题或其他内容。 重要的部分是我必须使用接口(interface)类来执行此操作,而下载此数据的 AsyncTask 也必须在另一个类中。所以我目前很困惑如何使这种通信成为可能,以及如何在 AsyncTask 类中使用尽可能少的代码。我也不太了解这个接口(interface)的东西。 请有人帮忙。 所以这是主要 Activity :

package com.example.gmapsexample;

public class MainActivity extends Activity {

    private GoogleMap mMap;
    Marker marker = null;
    HttpClient klient;
    String data;
    String s;
    Double latt, lngg;
    GoogleMapOptions options;
    String adres = "http://api.geonames.org/citiesJSON?north=44.1&south=-9.9&east=-22.4&west=55.2&lang=en&username=sartheris";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        options = new GoogleMapOptions();
        mMap = ((MapFragment) getFragmentManager().findFragmentById(R.id.map)).getMap();
        options.mapType(GoogleMap.MAP_TYPE_SATELLITE).compassEnabled(true).rotateGesturesEnabled(true).tiltGesturesEnabled(true).zoomControlsEnabled(true);

        klient = new DefaultHttpClient();

        GetJson gg = new GetJson();
        gg.execute();

        /** On Info Window Click */
        mMap.setOnInfoWindowClickListener(new OnInfoWindowClickListener() {

            @Override
            public void onInfoWindowClick(Marker arg0) {
                marker.setTitle(s);
                Toast.makeText(getApplicationContext(), "Info Window Clicked", Toast.LENGTH_SHORT).show();
            }
        });
    }
}

这是 GetJson 类

package com.example.gmapsexample;

public class GetJson extends AsyncTask<String, Void, String> {

    HttpClient klient;
    String adres = "http://api.geonames.org/citiesJSON?north=44.1&south=-9.9&east=-22.4&west=55.2&lang=en&username=sartheris";
    String s;
    Double latt, lngg;
    private GoogleMap mMap;
    Marker marker;
    GoogleMapOptions options;

    @Override
    protected String doInBackground(String... params) {
        klient = new DefaultHttpClient();
        options = new GoogleMapOptions();
        StringBuilder url = new StringBuilder(adres);
        HttpGet hg = new HttpGet(url.toString());
        HttpResponse hr = null;
        try {
            hr = klient.execute(hg);
        } catch (ClientProtocolException e1) {
            e1.printStackTrace();
        } catch (IOException e1) {
            e1.printStackTrace();
        }
        int status = hr.getStatusLine().getStatusCode();
        if (status == 200) {
            HttpEntity he = hr.getEntity();
            String data = null;
            try {
                data = EntityUtils.toString(he);
            } catch (ParseException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
            JSONObject jsonGet = null;
            try {
                jsonGet = new JSONObject(data);
            } catch (JSONException e1) {
                e1.printStackTrace();
            }
            if (jsonGet.has("geonames")) {
                try {
                    JSONObject arrGet = jsonGet.getJSONArray("geonames").getJSONObject(0);
                    s = arrGet.getString("toponymName");
                    latt = arrGet.getDouble("lat");
                    lngg = arrGet.getDouble("lng");
                } catch (JSONException e) {
                    e.printStackTrace();
                }
            }
        }
        return null;
    }

    @Override
    protected void onPostExecute(String result) {
        super.onPostExecute(result);
        marker = new Marker(this);
        marker = mMap.addMarker(new MarkerOptions()
        .position(new LatLng(latt, lngg))
        .title("HELLO WORLD").snippet("BLQ")
                .icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_AZURE))
                        .draggable(true));
    }
}

现在我需要一个有助于数据传递的接口(interface)类...

最佳答案

在你的主类中创建一个接口(interface):

public interface ParsingCallback{

    void onFinishedParsing(MarkerOptions marker);
}

将它传递给你的 AsyncTask

GetJson gg = new GetJson(new ParsingCallback(){
    void onFinishedParsing(MarkerOptions marker) {
         mMap.addMarker(marker);
    }     
);
gg.execute();

在你的 AsyncTask 中创建构造函数

private ParsingCallback _callback;

public GetJson (ParsingCallback callback){
     _callback = callback;
}

然后在你的 onPostExecute 中:

@Override
protected void onPostExecute(String result) {
    super.onPostExecute(result);


    _callback.onFinishedParsing(new MarkerOptions()
         .position(new LatLng(latt, lngg))
         .title("HELLO WORLD")
         .snippet("BLQ")
    );
}

希望对您有所帮助:)

关于android - Google Maps API 获取 JSON 数据并将其设置为信息窗口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18120411/

相关文章:

android - Android Gradle错误

android - 从在 Android 中以编程方式创建的父 View 中查找 subview

android - 使用 Robolectric 测试 DialogFragments

c# - 不是按名称而是按类型指定接口(interface)成员

c# - 参数化一个通用接口(interface) - 创建一个 Dictionary<Type, Interface<T>>?

c# - 通过继承实现接口(interface)

java - Android:当两个字符串相等时,在 onPostExecute() 中启动一个新的 Activity

Android AsyncTask 取消时不会停止,为什么?

android - 满足条件时自动启动asynctask

android - socialauth-android 与 Facebook 授权成功但验证码为空