1

I am trying to download data from the following https://d17h27t6h515a5.cloudfront.net/topher/2017/May/59121517_baking/baking.json

Here is my Android Code for downloading the data

public class DownloadTask extends AsyncTask {

private List<Ingredients> tIngredients = new ArrayList<>();
private List<Steps> tSteps = new ArrayList<>();

String result;

@Override
protected String doInBackground(String... params) {
    result = "";
    OkHttpClient client = new OkHttpClient();
    Request request = new Request.Builder().url("https://d17h27t6h515a5.cloudfront.net/topher/2017/May/59121517_baking/baking.json").build();
    try {
        result = client.newCall(request).execute().body().string();
        Log.i("RESULT", result);
        JSONArray rootArray = new JSONArray(result);
        for (int i = 0; i < rootArray.length(); i++) {
            JSONObject tempObject = rootArray.getJSONObject(i);
            JSONArray ingredients = tempObject.getJSONArray("ingredients");
          for(int j = 0 ; j< ingredients.length(); j++) {
                JSONObject tempIngredient = ingredients.getJSONObject(j);
                Ingredients newIngredient = new Ingredients(tempIngredient.getString("quantity"),
                        tempIngredient.getString("measure"),
                        tempIngredient.getString("ingredient"));
                tIngredients.add(newIngredient);
                j++;
            }
            JSONArray steps = tempObject.getJSONArray("steps");
            for (int k = 0; k < steps.length(); k++) {
                JSONObject tempStep = steps.getJSONObject(k);
                Steps newStep = new Steps(tempStep.getString("id"), tempStep.getString("shortDescription"),
                        tempStep.getString("description"), tempStep.getString("videoURL"));
                tSteps.add(newStep);
            }
            Recipe newRecipe = new Recipe(tempObject.getString("id"), tempObject.getString("name"), tempObject.getString("servings"), tIngredients, tSteps);
            MainActivity.mRecipies.add(newRecipe);

        }
    } catch (Exception e) {
        Log.i("TAG", e.getMessage());
    }

    return null;
}

@Override
protected void onPostExecute(String s) {


    for (int i = 0; i < MainActivity.mRecipies.size(); i++) {

        Log.i("Recipie Number", String.valueOf(i));
        for (int j = 0; j < MainActivity.mRecipies.get(i).getIngredients().size(); j++) {
            Log.i("Ingre  - ", MainActivity.mRecipies.get(i).getIngredients().get(j).getIngredient());

        }
        MainActivity.myList.setAdapter(MainActivity.myAdapter);
        super.onPostExecute(s);
    }
}

}

When i try to check the downloaded data, it shows repeated results and sometimes even strange results,

the logcat when printed..

    06-21 05:16:01.402 26656-26656/com.example.vamshi.baking I/Recipie Number: 0
06-21 05:16:01.402 26656-26656/com.example.vamshi.baking I/Ingre  -: Graham Cracker crumbs
06-21 05:16:01.402 26656-26656/com.example.vamshi.baking I/Ingre  -: granulated sugar
06-21 05:16:01.402 26656-26656/com.example.vamshi.baking I/Ingre  -: vanilla
06-21 05:16:01.402 26656-26656/com.example.vamshi.baking I/Ingre  -: Mascapone Cheese(room temperature)
06-21 05:16:01.402 26656-26656/com.example.vamshi.baking I/Ingre  -: cream cheese(softened)
06-21 05:16:01.402 26656-26656/com.example.vamshi.baking I/Ingre  -: Bittersweet chocolate (60-70% cacao)
06-21 05:16:01.402 26656-26656/com.example.vamshi.baking I/Ingre  -: granulated sugar
06-21 05:16:01.402 26656-26656/com.example.vamshi.baking I/Ingre  -: large eggs
06-21 05:16:01.402 26656-26656/com.example.vamshi.baking I/Ingre  -: all purpose flour
06-21 05:16:01.402 26656-26656/com.example.vamshi.baking I/Ingre  -: salt
06-21 05:16:01.403 26656-26656/com.example.vamshi.baking I/Ingre  -: sifted cake flour
06-21 05:16:01.403 26656-26656/com.example.vamshi.baking I/Ingre  -: baking powder
06-21 05:16:01.403 26656-26656/com.example.vamshi.baking I/Ingre  -: vanilla extract, divided
06-21 05:16:01.403 26656-26656/com.example.vamshi.baking I/Ingre  -: whole milk
06-21 05:16:01.403 26656-26656/com.example.vamshi.baking I/Ingre  -: egg whites
06-21 05:16:01.403 26656-26656/com.example.vamshi.baking I/Ingre  -: Graham Cracker crumbs
06-21 05:16:01.403 26656-26656/com.example.vamshi.baking I/Ingre  -: granulated sugar
06-21 05:16:01.403 26656-26656/com.example.vamshi.baking I/Ingre  -: vanilla,divided
06-21 05:16:01.403 26656-26656/com.example.vamshi.baking I/Ingre  -: large whole eggs
06-21 05:16:01.403 26656-26656/com.example.vamshi.baking I/Ingre  -: heavy cream
06-21 05:16:01.404 26656-26656/com.example.vamshi.baking I/Recipie Number: 1
06-21 05:16:01.404 26656-26656/com.example.vamshi.baking I/Ingre  -: Graham Cracker crumbs
06-21 05:16:01.405 26656-26656/com.example.vamshi.baking I/Ingre  -: granulated sugar
06-21 05:16:01.405 26656-26656/com.example.vamshi.baking I/Ingre  -: vanilla
06-21 05:16:01.405 26656-26656/com.example.vamshi.baking I/Ingre  -: Mascapone Cheese(room temperature)
06-21 05:16:01.405 26656-26656/com.example.vamshi.baking I/Ingre  -: cream cheese(softened)
06-21 05:16:01.405 26656-26656/com.example.vamshi.baking I/Ingre  -: Bittersweet chocolate (60-70% cacao)
06-21 05:16:01.405 26656-26656/com.example.vamshi.baking I/Ingre  -: granulated sugar
06-21 05:16:01.405 26656-26656/com.example.vamshi.baking I/Ingre  -: large eggs
06-21 05:16:01.405 26656-26656/com.example.vamshi.baking I/Ingre  -: all purpose flour
06-21 05:16:01.405 26656-26656/com.example.vamshi.baking I/Ingre  -: salt
06-21 05:16:01.405 26656-26656/com.example.vamshi.baking I/Ingre  -: sifted cake flour
06-21 05:16:01.405 26656-26656/com.example.vamshi.baking I/Ingre  -: baking powder
06-21 05:16:01.405 26656-26656/com.example.vamshi.baking I/Ingre  -: vanilla extract, divided
06-21 05:16:01.405 26656-26656/com.example.vamshi.baking I/Ingre  -: whole milk
06-21 05:16:01.405 26656-26656/com.example.vamshi.baking I/Ingre  -: egg whites
06-21 05:16:01.405 26656-26656/com.example.vamshi.baking I/Ingre  -: Graham Cracker crumbs
06-21 05:16:01.405 26656-26656/com.example.vamshi.baking I/Ingre  -: granulated sugar
06-21 05:16:01.405 26656-26656/com.example.vamshi.baking I/Ingre  -: vanilla,divided
06-21 05:16:01.405 26656-26656/com.example.vamshi.baking I/Ingre  -: large whole eggs
06-21 05:16:01.405 26656-26656/com.example.vamshi.baking I/Ingre  -: heavy cream
06-21 05:16:01.405 26656-26656/com.example.vamshi.baking I/Recipie Number: 2
06-21 05:16:01.405 26656-26656/com.example.vamshi.baking I/Ingre  -: Graham Cracker crumbs
06-21 05:16:01.406 26656-26656/com.example.vamshi.baking I/Ingre  -: granulated sugar
06-21 05:16:01.406 26656-26656/com.example.vamshi.baking I/Ingre  -: vanilla
06-21 05:16:01.406 26656-26656/com.example.vamshi.baking I/Ingre  -: Mascapone Cheese(room temperature)
06-21 05:16:01.406 26656-26656/com.example.vamshi.baking I/Ingre  -: cream cheese(softened)
06-21 05:16:01.406 26656-26656/com.example.vamshi.baking I/Ingre  -: Bittersweet chocolate (60-70% cacao)
06-21 05:16:01.406 26656-26656/com.example.vamshi.baking I/Ingre  -: granulated sugar
06-21 05:16:01.406 26656-26656/com.example.vamshi.baking I/Ingre  -: large eggs
06-21 05:16:01.406 26656-26656/com.example.vamshi.baking I/Ingre  -: all purpose flour
06-21 05:16:01.406 26656-26656/com.example.vamshi.baking I/Ingre  -: salt
06-21 05:16:01.406 26656-26656/com.example.vamshi.baking I/Ingre  -: sifted cake flour
06-21 05:16:01.406 26656-26656/com.example.vamshi.baking I/Ingre  -: baking powder
06-21 05:16:01.406 26656-26656/com.example.vamshi.baking I/Ingre  -: vanilla extract, divided
06-21 05:16:01.406 26656-26656/com.example.vamshi.baking I/Ingre  -: whole milk
06-21 05:16:01.406 26656-26656/com.example.vamshi.baking I/Ingre  -: egg whites
06-21 05:16:01.406 26656-26656/com.example.vamshi.baking I/Ingre  -: Graham Cracker crumbs
06-21 05:16:01.406 26656-26656/com.example.vamshi.baking I/Ingre  -: granulated sugar
06-21 05:16:01.406 26656-26656/com.example.vamshi.baking I/Ingre  -: vanilla,divided
06-21 05:16:01.406 26656-26656/com.example.vamshi.baking I/Ingre  -: large whole eggs
06-21 05:16:01.406 26656-26656/com.example.vamshi.baking I/Ingre  -: heavy cream
06-21 05:16:01.407 26656-26656/com.example.vamshi.baking I/Recipie Number: 3
06-21 05:16:01.407 26656-26656/com.example.vamshi.baking I/Ingre  -: Graham Cracker crumbs
06-21 05:16:01.407 26656-26656/com.example.vamshi.baking I/Ingre  -: granulated sugar
06-21 05:16:01.407 26656-26656/com.example.vamshi.baking I/Ingre  -: vanilla
06-21 05:16:01.407 26656-26656/com.example.vamshi.baking I/Ingre  -: Mascapone Cheese(room temperature)
06-21 05:16:01.407 26656-26656/com.example.vamshi.baking I/Ingre  -: cream cheese(softened)
06-21 05:16:01.407 26656-26656/com.example.vamshi.baking I/Ingre  -: Bittersweet chocolate (60-70% cacao)
06-21 05:16:01.407 26656-26656/com.example.vamshi.baking I/Ingre  -: granulated sugar
06-21 05:16:01.407 26656-26656/com.example.vamshi.baking I/Ingre  -: large eggs
06-21 05:16:01.407 26656-26656/com.example.vamshi.baking I/Ingre  -: all purpose flour
06-21 05:16:01.407 26656-26656/com.example.vamshi.baking I/Ingre  -: salt
06-21 05:16:01.407 26656-26656/com.example.vamshi.baking I/Ingre  -: sifted cake flour
06-21 05:16:01.407 26656-26656/com.example.vamshi.baking I/Ingre  -: baking powder
06-21 05:16:01.407 26656-26656/com.example.vamshi.baking I/Ingre  -: vanilla extract, divided
06-21 05:16:01.407 26656-26656/com.example.vamshi.baking I/Ingre  -: whole milk
06-21 05:16:01.407 26656-26656/com.example.vamshi.baking I/Ingre  -: egg whites
06-21 05:16:01.407 26656-26656/com.example.vamshi.baking I/Ingre  -: Graham Cracker crumbs
06-21 05:16:01.407 26656-26656/com.example.vamshi.baking I/Ingre  -: granulated sugar
06-21 05:16:01.407 26656-26656/com.example.vamshi.baking I/Ingre  -: vanilla,divided
06-21 05:16:01.407 26656-26656/com.example.vamshi.baking I/Ingre  -: large whole eggs
06-21 05:16:01.408 26656-26656/com.example.vamshi.baking I/Ingre  -: heavy cream

Then i figured Maybe it was because i wasnt clearing the two arraylists this is the result when i add the clear commands for the two

Log.i("RESULT", result);
        JSONArray rootArray = new JSONArray(result);
        for (int i = 0; i < rootArray.length(); i++) {
            tIngredients.clear();
            tSteps.clear();
            JSONObject tempObject = rootArray.getJSONObject(i);
            JSONArray ingredients = tempObject.getJSONArray("ingredients");

The result is as follows

06-21 05:21:50.464 32625-32625/com.example.vamshi.baking I/Recipie Number: 0
06-21 05:21:50.464 32625-32625/com.example.vamshi.baking I/Ingre  -: Graham Cracker crumbs
06-21 05:21:50.464 32625-32625/com.example.vamshi.baking I/Ingre  -: granulated sugar
06-21 05:21:50.464 32625-32625/com.example.vamshi.baking I/Ingre  -: vanilla,divided
06-21 05:21:50.464 32625-32625/com.example.vamshi.baking I/Ingre  -: large whole eggs
06-21 05:21:50.464 32625-32625/com.example.vamshi.baking I/Ingre  -: heavy cream
06-21 05:21:50.465 32625-32625/com.example.vamshi.baking I/Recipie Number: 1
06-21 05:21:50.465 32625-32625/com.example.vamshi.baking I/Ingre  -: Graham Cracker crumbs
06-21 05:21:50.465 32625-32625/com.example.vamshi.baking I/Ingre  -: granulated sugar
06-21 05:21:50.465 32625-32625/com.example.vamshi.baking I/Ingre  -: vanilla,divided
06-21 05:21:50.465 32625-32625/com.example.vamshi.baking I/Ingre  -: large whole eggs
06-21 05:21:50.465 32625-32625/com.example.vamshi.baking I/Ingre  -: heavy cream
06-21 05:21:50.465 32625-32625/com.example.vamshi.baking I/Recipie Number: 2
06-21 05:21:50.465 32625-32625/com.example.vamshi.baking I/Ingre  -: Graham Cracker crumbs
06-21 05:21:50.465 32625-32625/com.example.vamshi.baking I/Ingre  -: granulated sugar
06-21 05:21:50.465 32625-32625/com.example.vamshi.baking I/Ingre  -: vanilla,divided
06-21 05:21:50.465 32625-32625/com.example.vamshi.baking I/Ingre  -: large whole eggs
06-21 05:21:50.465 32625-32625/com.example.vamshi.baking I/Ingre  -: heavy cream
06-21 05:21:50.465 32625-32625/com.example.vamshi.baking I/Recipie Number: 3
06-21 05:21:50.465 32625-32625/com.example.vamshi.baking I/Ingre  -: Graham Cracker crumbs
06-21 05:21:50.465 32625-32625/com.example.vamshi.baking I/Ingre  -: granulated sugar
06-21 05:21:50.465 32625-32625/com.example.vamshi.baking I/Ingre  -: vanilla,divided
06-21 05:21:50.465 32625-32625/com.example.vamshi.baking I/Ingre  -: large whole eggs
06-21 05:21:50.465 32625-32625/com.example.vamshi.baking I/Ingre  -: heavy cream

Please suggest why is this happening, thanks in advance.

3 Answers3

1

You do not need fields.

You want individual ingredients and steps per Recipe.

You may also want to look at Why does my ArrayList contain N copies of the last item added to the list?

    JSONArray rootArray = new JSONArray(result);
    // For each Recipe
    for (int i = 0; i < rootArray.length(); i++) {
        JSONObject tempObject = rootArray.getJSONObject(i);
        JSONArray jIngredients = tempObject.getJSONArray("ingredients");
        JSONArray jSteps = tempObject.getJSONArray("steps");

        // Get the ingredients
        List<Ingredients> ingredients = new ArrayList<>();
        for(int j = 0 ; j< jIngredients.length(); j++) {
            JSONObject tempIngredient = jIngredients.getJSONObject(j);
            Ingredients newIngredient = new Ingredients(tempIngredient.getString("quantity"),
                    tempIngredient.getString("measure"),
                    tempIngredient.getString("ingredient"));
            ingredients.add(newIngredient);
        }

        // Get the steps
        List<Steps> steps = new ArrayList<>();
        for (int j = 0; j < jSteps.length(); j++) {
            JSONObject tempStep = jSteps.getJSONObject(j);
            Steps newStep = new Steps(tempStep.getString("id"), tempStep.getString("shortDescription"),
                    tempStep.getString("description"), tempStep.getString("videoURL"));
            steps.add(newStep);
        }

        // Create the recipe
        Recipe newRecipe = new Recipe(tempObject.getString("id"), tempObject.getString("name"), tempObject.getString("servings"), ingredients, steps);
        MainActivity.mRecipies.add(newRecipe);
    }

Suggestions:

  • Retrofit
  • Gson
  • Not using static variables in your Activity class
OneCricketeer
  • 179,855
  • 19
  • 132
  • 245
  • I tried using your approach, but now the same data is getting repeated,the ingredients for the first recipie are repeated for the remaining – Vamshi Krishna Jun 21 '17 at 02:00
  • Did you read the link in my answer, and does it apply to your code? – OneCricketeer Jun 21 '17 at 02:02
  • yes, i read your link, it applies perfectly to my code, but im using static because, there are more activities that are depending on the mRecipies arraylist. Could you please explain how to overcome this problem. – Vamshi Krishna Jun 21 '17 at 02:07
  • Ideally, you would store the data in persistent storage, such as SQLite that you can query across all activity or fragment objects. Or use a singleton pattern. Or this new ViewModel thing. https://developer.android.com/topic/libraries/architecture/viewmodel.html ... The point is that your `Recipe` or `Ingredient` classes should **especially not** have static values. And if you do, then, yes, everything is duplicated because there exists only one static value for *all* instances of those objects. – OneCricketeer Jun 21 '17 at 02:10
  • Thank you so much, i will definitely try the singleton pattern – Vamshi Krishna Jun 21 '17 at 02:15
0

These two lines need to go inside your loop:

private List<Ingredients> tIngredients = new ArrayList<>();
private List<Steps> tSteps = new ArrayList<>();

Also, you second loop has an extra j++ Remove that.

MS2099
  • 369
  • 2
  • 11
0

In doinbackground method in the second loop you are increasing j variable two times one in for loop j++ and then inside loop j++. Unless there you want to skipp ingredients you should remove j++ inside loop

G Singh
  • 156
  • 4