0

嘿伙计们,我创建了一个应用程序,它向 google 方向 Web 服务发出 HTTPRequest 并返回 JSONobject。

这是我的 JSONParser.java 的样子

public class JSONParser {
InputStream is = null;
JSONObject jObj = null;
String json = "";

public JSONParser() {
}

public void getJSONFromUrl(final String url, final responseListener target) {
    new AsyncTask<Void, Void, String>() {
        protected String doInBackground(Void... params) {
            HttpURLConnection httpURLConnection = null;
            StringBuilder stringBuilder = new StringBuilder();
            try {
                httpURLConnection = (HttpURLConnection) new URL(url).openConnection();
                InputStreamReader inputStreamReader = new InputStreamReader(httpURLConnection.getInputStream());

                int read;
                char[] buff = new char[1024];
                while ((read = inputStreamReader.read(buff)) != -1) {
                    stringBuilder.append(buff, 0, read);
                }
                return stringBuilder.toString();
            } catch (MalformedURLException localMalformedURLException) {
                return "";
            } catch (IOException localIOException) {
                return "";
            } finally {
                if (httpURLConnection != null)
                    httpURLConnection.disconnect();
            }

        }

        protected void onPostExecute(String result) {
            super.onPostExecute(result);
            target.onResponseComplete(result);
        }
    }.execute();
}

这是我的 responseListener.java

interface responseListener{
public void onResponseComplete(String response); }

我想调用方法 getJSONFromURL

String response = new JSONParser().getJSONFromUrl(makeURL(startLatitude,startLongitude,endLatitude,endtLongitude),new responseListener() {
    @Override
    public void onResponseComplete(String response) {
        try {
            ArrayList<HashMap<String, Object>> list = new ArrayList<HashMap<String, Object>>();
            JSONArray step = new JSONObject(response).getJSONArray("routes").getJSONObject(0).getJSONArray("legs")
                    .getJSONObject(0).getJSONArray("steps");

            for (int i = 0; i < step.length(); i++) {
                HashMap<String,Object> row = new HashMap<String,Object>();
                row.put("address", step.getJSONObject(i).getString("html_instructions"));
                row.put("start",new LatLng(Double.parseDouble(step.getJSONObject(i).getJSONObject("start_location").getString("lat")), Double.parseDouble(step.getJSONObject(i).getJSONObject("start_location").getString("lng"))));
                row.put("end",  new LatLng(Double.parseDouble(step.getJSONObject(i).getJSONObject("start_location").getString("lat")), Double.parseDouble(step.getJSONObject(i).getJSONObject("start_location").getString("lng"))));
                list.add(row);

            }

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

但它一直说Type mismatch: cannot convert from void to String 关于如何解决这个问题的任何想法?先感谢您

4

2 回答 2

1

这是因为你return typevoid

public void getJSONFromUrl

将返回类型更改为String和。returnString

在这一行

String response = new JSONParser().getJSONFromUrl(makeURL(startLatitude,startLongitude,endLatitude,endtLongitude),new responseListener()

但该方法显然返回void

正如 Diego Suárez 在评论中指出的那样,不需要这个response变量……这就是回调的用途。您可以将其更改为

new JSONParser().getJSONFromUrl(makeURL(startLatitude,startLongitude,endLatitude,endtLongitude),new responseListener()

完成后将启动回调onPostExecute()

于 2013-10-29T17:08:51.260 回答
0

因为你的方法

 public void getJSONFromUrl(final String url, final responseListener target) 

返回类型为void

并通过以下行

String response = new JSONParser().getJSONFromUrl(makeURL(startLatitude,startLongitude,endLatitude,endtLongitude),new responseListener() {

您正在尝试在您的字符串响应中设置 this 。

你需要改变

 public String getJSONFromUrl(final String url, final responseListener target) 

并从此方法返回响应字符串。

于 2013-10-29T17:07:56.027 回答