2015-06-12 2 views
0

Мое приложение обращается к API FourSquare. Вызов происходит в моей getResponse() функции, и эта функция вызывается каждый раз, когда я делаю новый Explore().execute();Приложение для Android продолжает терпеть неудачу при разборе JSON

Теперь я могу получить строку из API ... Но когда я прохожу эту строку displayResults() функции, она становится null (у меня есть комментарий к коду ниже, чтобы точно показать, где). И поскольку эта строка становится пустой, я не могу разобрать JSON. Что вызывает эту проблему?

public TextView mBusinessName; 
public TextView mCategorie; 
public WebView mLocationView; 

private class Explore extends AsyncTask<Void, String, String>{ 

    String resp = ""; 

    @Override 
    protected void onPreExecute() { 

    } 

    @Override 
    protected String doInBackground(Void... String) { 
     //I get a complete JSON string and assign to resp HERE. 
     resp = getResponse(); 
     return null; 
    } 

    @Override 
    protected void onPostExecute(String s) { 
     //pass resp to display results 
     displayResults(resp); 
    } 
} 

public String getResponse(){ 
    String clientSecret = getResources().getString(R.string.client_secret); 
    String clientID = getResources().getString(R.string.client_id); 
    String url = "https://api.foursquare.com/v2/venues/explore?ll=" 
      + mLatitude + "," + mLongitude 
      + "&limit=" + 5 
      + "&radius=" + mRadius 
      + "&query=" + mTerm 
      + "&oauth_token=" 
      + "&client_secret="+ clientSecret 
      + "&client_id="+ clientID 
      + "&v=20150610"; 

    String getResponseString = ""; 
    try{ 
     URL searchUrl = new URL(url); 
     HttpURLConnection httpsClient = 
       (HttpURLConnection) searchUrl.openConnection(); 

     BufferedReader reader = new BufferedReader(new InputStreamReader(httpsClient.getInputStream())); 
     try{ 
      getResponseString = ""; 
      while((getResponseString = reader.readLine()) != null){ 
       Log.d("Response ==== ", getResponseString); 
      } 
     }catch (Exception e){ 
      e.printStackTrace(); 
     }finally { 
      if(reader != null){ 
       try{ 
        reader.close(); 
       }catch (Exception e){ 
        e.printStackTrace(); 
       } 
      } 
     } 
    }catch (Exception e){ 
     e.printStackTrace(); 
    } 

    return getResponseString; 
} 

public void displayResults(String resp){ 

    //HERE is where it fails. The String resp becomes null/empty 
    // have tried logging resp, the log doesn't show up at all 
    // because of this, JSON string can not be parsed!!!! 
    try { 
     JSONObject json = new JSONObject(resp); 
     JSONArray items = json.getJSONObject("response") 
       .getJSONArray("groups").getJSONObject(0) 
       .getJSONArray("items"); 

     //randomize items 
     JSONObject item = items.getJSONObject(getRandomIndex(items.length()-1)); 

     String name = item.getJSONObject("venue").optString("name"); 
     String categorie = item.getJSONObject("venue").getJSONArray("categories").getJSONObject(0).getString("name"); 

     String latitude = item.getJSONObject("venue").getJSONObject("location").optString("lat"); 
     String longitude = item.getJSONObject("venue").getJSONObject("location").optString("lng"); 
     String image = "http://maps.google.com/maps/api/staticmap?center=" 
       + latitude + "," + longitude 
       + "&markers=size:tiny%color:red%7C" + latitude + "," + longitude 
       +"&zoom=17&size=375x225&sensor=false"; 

     mLocationView.loadUrl(image); 
     mBusinessName.setText(name); 
     mCategorie.setText(categorie); 

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

EDIT: Переменная resp становится пустой/пустой внутри функции displayResults(). Я не знаю, как это происходит.

ответ

1

Ваш метод getResponse() ничего не делает. Вы должны изменить его так, чтобы он фактически возвращал полную строку.

try{ 
     StringBuilder sb = new StringBuilder(); 
     getResponseString = ""; 
     while((getResponseString = reader.readLine()) != null){ 
      Log.d("Response ==== ", getResponseString); 
      sb.append(getResponseString); 
     } 
    }catch (Exception e){ 
     e.printStackTrace(); 
    }finally { 
     if(reader != null){ 
      try{ 
       reader.close(); 
      }catch (Exception e){ 
       e.printStackTrace(); 
      } 
     } 
    } 

return sb.toString(); 
+0

Но я назначаю getResponseString в этой функции. Строка внутри цикла while у меня есть getResponseString = reader.readLine())! = Null –

+0

Но каждый раз, когда вы выполняете цикл, вы продолжаете заменять предыдущую строку. Вам нужно добавить результат, создав StringBuilder. Проверьте мои изменения. –

+0

Вы, сэр, только что сделали мой день. Я благодарю тебя. –