2017-12-29 10 views
1

Meine JSON-Datei, die ich in meinem VPS hosten ist 2,2 MB und wenn ich OkHttp verwenden, um eine Anfrage zu erstellen, um es abzurufen und dann den JSON zu protokollieren, sehe ich, dass nicht alle JSON angefordert wurde.OkHttp bekommt nicht den gesamten JSON

Mein Code:

public void sendJSONRequest() { 
    // init http client 
    mOkHttpClient = new OkHttpClient(); 
    // init a request 
    mRequest = new okhttp3.Request.Builder().url(url).build(); 
    // execute the request (async) 
    mOkHttpClient.newCall(mRequest).enqueue(new Callback() { 
     @Override 
     public void onFailure(Call call, IOException e) { 
      Log.i(TAG, e.getMessage()); 
     } 

     @Override 
     public void onResponse(Call call, okhttp3.Response response) throws IOException { 
      Log.i(TAG, response.body().string()); 
      parseGameJSONResponse(response.body().string()); 
     } 
    }); 
} 

Der Fehler, der innerhalb parseGameJSONResponse werfen wird:

java.lang.IllegalStateException: closed 
                      at okio.RealBufferedSource.rangeEquals(RealBufferedSource.java:398) 
                      at okio.RealBufferedSource.rangeEquals(RealBufferedSource.java:392) 
                      at okhttp3.internal.Util.bomAwareCharset(Util.java:449) 
                      at okhttp3.ResponseBody.string(ResponseBody.java:174) 

Der Fehler wird ausgelöst, weil die JSON

Parse json Methode geschnitten wurde:

public ArrayList<Game> parseGameJSONResponse(String json) { 
    ArrayList<Game> upcomingGames = new ArrayList<>(); 
    // Main JSON Object 
    JSONObject mainJsonObject = null; 
    try { 
     mainJsonObject = new JSONObject(json); 
    } catch (JSONException e) { 
     e.printStackTrace(); 
    } 
    boolean removeDuplicates = mSettingsValue.getRemoveDuplicates(); 
    if (mainJsonObject != null) { 
     // MAIN JSON Data Array 
     JSONArray jsonArray = null; 
     try { 
      jsonArray = mainJsonObject.getJSONArray("data"); 
     } catch (JSONException e) { 
      e.printStackTrace(); 
     } 

     if (jsonArray != null && jsonArray.length() > 0) { 
      try { 
       for (int i = 0; i < jsonArray.length(); i++) { 
        JSONObject gameObject = jsonArray.getJSONObject(i); 
        Game game = new Game(); 

        if (gameObject.has("id")) { 
         game.id = gameObject.getInt("id"); 
        } 

        if (gameObject.has("name")) { 
         String name = gameObject.getString("name"); 
         game.name = name; 
         if (name.endsWith("Edition") && removeDuplicates) { 
          // skip this iteration because it's a special edition and we don't want editions if setting is set to true 
          continue; 
         } 
        } 

        if (gameObject.has("slug")) { 
         // Creates the URL here 
         game.url = gameObject.getString("slug"); 
        } 

        if (gameObject.has("updated_at")) { 
         game.updated_at = gameObject.getLong("updated_at"); 
        } 

        if (gameObject.has("summary")) { 
         game.summary = gameObject.getString("summary"); 
        } 

        if (gameObject.has("first_release_date")) { 
         game.first_release_date = gameObject.getLong("first_release_date"); 
        } 

        // Game Release Dates 
        if (gameObject.has("release_dates")) { 
         JSONArray jsonReleaseDatesArray = gameObject.getJSONArray("release_dates"); 
         ArrayList<ReleaseDate> releaseDates = new ArrayList<>(); 
         for (int y = 0; y < jsonReleaseDatesArray.length(); y++) { 
          ReleaseDate releaseDate = new ReleaseDate(); 
          JSONObject jsonReleaseDateObject = jsonReleaseDatesArray.getJSONObject(y); 
          if (jsonReleaseDateObject.has("category") && !jsonReleaseDateObject.isNull("category")) { 
           releaseDate.category = jsonReleaseDateObject.getInt("category"); 
          } 
          if (jsonReleaseDateObject.has("platform") && !jsonReleaseDateObject.isNull("platform")) { 
           releaseDate.platform = jsonReleaseDateObject.getInt("platform"); 
          } 
          if (jsonReleaseDateObject.has("date") && !jsonReleaseDateObject.isNull("date")) { 
           releaseDate.date = jsonReleaseDateObject.getLong("date"); 
          } 
          if (jsonReleaseDateObject.has("region") && !jsonReleaseDateObject.isNull("region")) { 
           releaseDate.region = jsonReleaseDateObject.getInt("region"); 
           // Toast.makeText(getContext(), releaseDate.region + ": Region", Toast.LENGTH_SHORT).show(); 
          } 
          if (jsonReleaseDateObject.has("y") && !jsonReleaseDateObject.isNull("y")) { 
           releaseDate.year = jsonReleaseDateObject.getInt("y"); 
          } 
          if (jsonReleaseDateObject.has("m") && !jsonReleaseDateObject.isNull("m")) { 
           releaseDate.month = jsonReleaseDateObject.getInt("m"); 
          } 
          if (jsonReleaseDateObject.has("human") && !jsonReleaseDateObject.isNull("human")) { 
           releaseDate.human = jsonReleaseDateObject.getString("human"); 
          } 
          releaseDates.add(releaseDate); 
         } 
         game.releaseDates = releaseDates; 
        } 

        // Screenshots 
        if (gameObject.has("screenshots")) { 
         JSONArray jsonScreenshotsArray = gameObject.getJSONArray("screenshots"); 
         ArrayList<String> screenshots = new ArrayList<>(); 
         for (int y = 0; y < jsonScreenshotsArray.length(); y++) { 
          JSONObject jsonScreenshotObject = jsonScreenshotsArray.getJSONObject(y); 
          screenshots.add(jsonScreenshotObject.getString("cloudinary_id")); 
         } 
         game.screenshots = screenshots; 
        } 

        // Videos 
        if (gameObject.has("videos")) { 
         ArrayList<String> videos = new ArrayList<>(); 
         JSONArray jsonVideosArray = gameObject.getJSONArray("videos"); 
         for (int y = 0; y < jsonVideosArray.length(); y++) { 
          JSONObject jsonVideoObject = jsonVideosArray.getJSONObject(y); 
          videos.add(jsonVideoObject.getString("video_id")); 
         } 
         game.videos = videos; 
        } 

        // Cover image 
        if (gameObject.has("cover")) { 
         JSONObject jsonCoverObject = gameObject.getJSONObject("cover"); 
         game.cover = jsonCoverObject.getString("cloudinary_id"); 
        } 

        // Websites 
        if (gameObject.has("websites")) { 
         JSONArray jsonWebsitesArray = gameObject.getJSONArray("websites"); 
         ArrayList<Website> websites = new ArrayList<>(); 
         for (int y = 0; y < jsonWebsitesArray.length(); y++) { 
          Website website = new Website(); 
          JSONObject jsonWebsiteObject = jsonWebsitesArray.getJSONObject(y); 
          website.category = jsonWebsiteObject.getInt("category"); 
          website.url = jsonWebsiteObject.getString("url"); 
          websites.add(website); 
         } 
         game.websites = websites; 
        } 

        upcomingGames.add(game); 

       } 
      } catch (JSONException e) { 
       e.printStackTrace(); 
      } 
     } 
    } 
    Toast.makeText(getContext(), "" + upcomingGames.size(), Toast.LENGTH_SHORT).show(); 
    return upcomingGames; 
} 

Danke Jungs. Wirklich zu schätzen jede Art von Hilfe, so danke

+0

Können Sie den Code von parseGameJSONResponse auch hinzufügen? – Stephen

+0

Okay! Kein Problem –

Antwort

1

Es scheint es versucht, lesen Sie den gleichen InputStream zweimal (möglicherweise nicht im Speicher zu speichern).

Ich denke, Sie sollten nur response.string() anstelle von response.body(). String() verwenden.

Auch wenn Sie denken, dass es mit dem Timing zu tun hat, können Sie Timeouts bearbeiten.

client = new OkHttpClient.Builder() 
    .connectTimeout(10, TimeUnit.SECONDS) 
    .writeTimeout(10, TimeUnit.SECONDS) 
    .readTimeout(30, TimeUnit.SECONDS) 
    .build(); 

Für mehr sehen Sie sich das an. https://github.com/square/okhttp/issues/1240

+0

Sie meinen response.toString() oder? Und vielen Dank –

+0

Vielen Dank. Es funktioniert jetzt. Sie können string() nur einmal aufrufen. –

Verwandte Themen