gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 03:26:37 27 4
gpt4 key购买 nike

我有一个有点长的问题。我现在正在学习 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com