gpt4 book ai didi

java - 在 Android 中解析 Google map 标记的 JSON 响应

转载 作者:太空宇宙 更新时间:2023-11-04 13:47:21 26 4
gpt4 key购买 nike

我正在尝试从服务器检索 JSON 响应,解析它并向我的 map 添加标记。我有一个工作 map ,并向其中添加了按钮,其中一个按钮我想从服务器加载标记。调用这样的操作:

 public void onClick(View v) {
switch (v.getId()){
case R.id.btnLoc:
if(LocOn == 0){
googleMap.setMyLocationEnabled(true);
double lat= googleMap.getMyLocation().getLatitude();
double lng = googleMap.getMyLocation().getLongitude();
LatLng ll = new LatLng(lat, lng);
googleMap.animateCamera(CameraUpdateFactory.newLatLngZoom(ll, 18));
Loc.setBackgroundResource(R.drawable.loc);
LocOn = 1;
LoadMarkers.setText("Clear Markers");
GetMarkers markers = new GetMarkers();
markers.execute();


} else {
LocOn = 0;
Loc.setBackgroundResource(R.drawable.noloc);
LoadMarkers.setText("Load Markers");
googleMap.clear();
}

}
}

“GetMarkers”操作将调用此:

class GetMarkers extends AsyncTask<User, Void, List<JMarker>>{

@Override
protected List<JMarker> doInBackground(User... params) {

try {
URL url = new URL("someurl.php");
HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();
conn.setRequestMethod("POST");
conn.setDoOutput(true);
String param = "username="+user.username+"&pw="+user.password;
OutputStream out = conn.getOutputStream();
DataOutputStream dataOut = new DataOutputStream(out);
dataOut.writeBytes(param.trim());

InputStream in = conn.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(in));
String line;
StringBuilder builder = new StringBuilder();
while((line = reader.readLine()) != null) {
builder.append(line);
}
reader.close();
String response = builder.toString();

System.out.println(response); //This works, I'm getting a JSON response. Just need to parse it and return it to onPostExecute for processing.

}

catch (IOException e) {
e.printStackTrace();
}

return null; //This will eventually return the JSON object
}
@Override
protected void onPostExecute(List<JMarker> jMarkers) {
for(JMarker marker: jMarkers) {
LatLng position = new LatLng(marker.LAT, marker.LNG);
googleMap.addMarker(new MarkerOptions().position(position));
}
}

}

onPostExecute,我正在尝试将最终返回的标记添加到 map 中。

我希望有人能帮助我。先感谢您。

最佳答案

我想你在 Map.java 的第 148 行有 NPE

我想这是

BufferedReader reader = new BufferedReader(new InputStreamReader(in));

意味着您的输入流为空。

这里有两件事:

1) 你应该在得到响应之前关闭你的OutputStream (out.close())

2) 当收到响应时,如果 code>200,您将不会从 conn.getInputStream() 获得任何内容;但从 conn.getErrorStream() 来看,存在服务器错误。

你可以这样应用:

 StringBuffer response = new StringBuffer();
System.out.println(conn.getResponseCode());
try {
BufferedReader in;

if (conn.getResponseCode() > 299) {
in = new BufferedReader(
new InputStreamReader(conn.getErrorStream()));
} else {
in = new BufferedReader(
new InputStreamReader(conn.getInputStream()));
}
String inputLine;


while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();

} catch (Exception ex) {
ex.printStackTrace();
}

但是我会放弃 AsyncTask,我会使用 http 客户端作为 Retrofit 或 Volley,因为它可以优雅地处理大量 http 场景。

关于java - 在 Android 中解析 Google map 标记的 JSON 响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30699893/

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