【问题标题】:Parse JSON response for Google Maps Marker in Android为 Android 中的 Google Maps Marker 解析 JSON 响应
【发布时间】:2015-06-08 00:42:10
【问题描述】:

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

 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,正在尝试将最终返回的标记添加到地图中。

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

【问题讨论】:

  • 您应该发布应用显示的错误消息
  • 我正在使用适用于 Android 的 Google Maps API。
  • 看起来你应该在调用execute()时发送一个用户参考,然后设置user = params[0]
  • 是的,我注意到了这一点,但一旦我意识到它发送的是空值。然后我从本地数据库加载用户,然后从那里开始。我在下面附上了我的答案。谢谢。

标签: java android json google-maps


【解决方案1】:

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

我想这是

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

意味着您的输入流为空。

这里有两件事:

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

2) 如果 code>200 得到响应,你将不会从 conn.getInputStream();但从 conn.getErrorStream() mening 出现服务器错误。

你可以这样申请:

 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 场景。

【讨论】:

  • 感谢您的回答;但是,这会引发相同的错误。您能否编辑您的答案以包含您提到的其他方法?谢谢。
  • 你能告诉我第 148 行是什么
  • 实现了空值,我没有发送用户。找到答案了,谢谢。
【解决方案2】:

我收到的答案和 cmets 帮助我“挠头”并得出这个答案。应用程序无法运行和崩溃的原因是因为我将空值传递给参数。一旦我传递了信息,我就能够获得 JSON 响应,创建一个 JSONArray 并返回它。一旦它被发送到 onPostExecute,我就在那里解析 JSONArray,并添加标记。工作代码:

首先,我启动任务。

GetMarkers markers = new GetMarkers();
markers.execute(user); //pass the user to the task

任务:

class GetMarkers extends AsyncTask<User, Void, JSONArray>{

        User markeruser = new User(userLocalStore.getLoggedInUser().username, userLocalStore.getLoggedInUser().password);
        JSONArray jsonarray = null;
        @Override
        protected JSONArray doInBackground(User... params) {

            try {
                URL url = new URL("https://someurl.com/file.php");
                HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();
                conn.setRequestMethod("POST");
                conn.setDoOutput(true);
                String param = "Username="+markeruser.username+"&pw="+markeruser.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();

                jsonarray = new JSONArray(response);
            }

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

            return jsonarray;
        }

        @Override
        protected void onPostExecute(JSONArray jsonarray) {

            try {

                for(int i=0; i<jsonarray.length(); i++){
                    JSONObject obj = jsonarray.getJSONObject(i);

                    String PT = obj.getString("NUMBER");
                    Double LAT = obj.getDouble("LATITUDE");
                    Double LNG = obj.getDouble("LONGITUDE");
                    LatLng position = new LatLng(LAT, LNG);

                    String title = "PT: " + PT;

                    googleMap.addMarker(new MarkerOptions().position(position).title(title).icon(BitmapDescriptorFactory.fromResource(R.drawable.red)));
                }

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

【讨论】:

    猜你喜欢
    • 2011-11-06
    • 2013-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-06
    • 1970-01-01
    • 2021-08-05
    相关资源
    最近更新 更多