Search code examples
androidjsonandroid-studioandroid-studio-2.1

java.lang.OutOfMemoryError at com.mysamples.jsonparsingdemo2.MainActivity$MovieAdapter.getView(MainActivity.java:158)


I am trying to parse the json object but still the error appears. here is the code from the MainActivity.java: The error states.

FATAL EXCEPTION: main Process: com.mysamples.jsonparsingdemo2, PID: 2618 java.lang.OutOfMemoryError

package com.mysamples.jsonparsingdemo2;

import android.content.Context;
import android.os.AsyncTask;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.RatingBar;
import android.widget.TextView;

import com.mysamples.jsonparsingdemo2.models.MovieModels;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;


import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;

public class MainActivity extends ActionBarActivity {


    private ListView listView;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    listView = (ListView)findViewById(R.id.listView);

        }




public class JSONTask extends AsyncTask<String,String,List<MovieModels>> {

    @Override
    protected List<MovieModels> doInBackground(String... urls) {
        HttpURLConnection httpURLConnection = null;
        BufferedReader reader = null;
        try {
            URL url = new URL(urls[0]);
            httpURLConnection = (HttpURLConnection) url.openConnection();
            httpURLConnection.connect();
            InputStream stream = httpURLConnection.getInputStream();
            reader = new BufferedReader(new InputStreamReader(stream));

            StringBuffer sBuffer = new StringBuffer();
            String line = "";
            while ((line = reader.readLine())!= null){
                sBuffer.append(line);
            }

            //Organizing the JSON object the JSON OBJECT
            String finalJson = sBuffer.toString();

            JSONObject parentObject = new JSONObject(finalJson);
            JSONArray parentArray = parentObject.getJSONArray("movies");

            //getting the objects from the url
            List<MovieModels> modelList = new ArrayList<>();
            for (int j = 0; j <parentArray.length() ; j++) {
                JSONObject finalObject = parentArray.getJSONObject(j);
                MovieModels models = new MovieModels();


                //Displaying the values from the url
                models.setMovie(finalObject.getString("movie"));
                models.setYear(finalObject.getInt("year"));
                models.setRating((float) finalObject.getDouble("rating"));
                models.setDirector(finalObject.getString("director"));
                models.setDuration(finalObject.getString("duration"));
                models.setTagline(finalObject.getString("tagline"));
                models.setImage(finalObject.getString("image"));
                models.setStory(finalObject.getString("story"));


                //getting the values from castList
                List<MovieModels.Cast> castList = new ArrayList<>();
                for (int i = 0; i <finalObject.getJSONArray("cast").length() ; i++) {
                    MovieModels.Cast cast = new MovieModels.Cast();
                    cast.setName(finalObject.getJSONArray("cast").getJSONObject(i).getString("name"));
                    castList.add(cast);
                }
                models.setCastList(castList);
                modelList.add(models);
            }

            return modelList;


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

            if (httpURLConnection!=null){
                httpURLConnection.disconnect();
            }
            try {
                if (reader!= null){
                    reader.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        return null;
    }

    @Override
    protected void onPostExecute(List<MovieModels> result) {
        super.onPostExecute(result);
        MovieAdapter movieAdapter = new MovieAdapter(getApplicationContext(), R.layout.custom_row, result);
        listView.setAdapter(movieAdapter);
    }
}

public class MovieAdapter extends ArrayAdapter{

    private List<MovieModels> modelList;
    private int resource;
    private LayoutInflater inflater;
    public MovieAdapter(Context context, int resource, List<MovieModels> objects) {
        super(context, resource,  objects);
        modelList = objects;
        this.resource = resource;
        inflater = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE);

    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {

        if (convertView != null) {
            convertView = inflater.inflate(R.layout.custom_row,null);
        }

        //CASTING ALL THE VIEWS FROM THE CUSTOM_ROW LAYOUT
        ImageView imageView;
        TextView textViewMovie;
        TextView textViewYear;
        TextView textViewDuration;
        TextView textViewDirector;
        TextView textViewTagLine;
        TextView textViewCast;
        TextView textViewStory;
        RatingBar ratingBar;

        imageView = (ImageView)convertView.findViewById(R.id.imageView);
        textViewMovie = (TextView)convertView.findViewById(R.id.textViewMovie);
        textViewYear = (TextView)convertView.findViewById(R.id.textViewYear);
        textViewDuration =(TextView)convertView.findViewById(R.id.textViewDuration);
        textViewDirector = (TextView)convertView.findViewById(R.id.textViewDirector);
        textViewTagLine = (TextView)convertView.findViewById(R.id.textViewTagLine);
        textViewCast = (TextView)convertView.findViewById(R.id.textViewCast);
        textViewStory = (TextView)convertView.findViewById(R.id.textViewStory);
        ratingBar = (RatingBar)convertView.findViewById(R.id.ratingBarMovie);


        //DISPLAYING THE TEXT TO THE TEXTVIEWS
        textViewMovie.setText(modelList.get(position).getMovie());
        textViewYear.setText(String.valueOf(modelList.get(position).getYear()));
        textViewDuration.setText(modelList.get(position).getDuration());
        textViewDirector.setText(modelList.get(position).getDirector());
        textViewTagLine.setText(modelList.get(position).getTagline());

        //RATINGBAR
        ratingBar.setRating(modelList.get(position).getRating()/2);

        //GETTING THE CAST NAME FROM THE ARRAY
        StringBuffer castBuffer = new StringBuffer();
        for (MovieModels.Cast cast : modelList.get(position).getCastList()){
            castBuffer.append(cast.getName()+ ", ");
        }
        textViewCast.setText(castBuffer);
        textViewStory.setText(modelList.get(position).getStory());

        return convertView;
    }
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.menu_main, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // Handle action bar item clicks here. The action bar will
    // automatically handle clicks on the Home/Up button, so long
    // as you specify a parent activity in AndroidManifest.xml.
    int id = item.getItemId();

    //noinspection SimplifiableIfStatement
    if (id == R.id.action_refresh) {
        new JSONTask().execute("http://jsonparsing.parseapp.com/jsonData/moviesData.txt");
    }

    return super.onOptionsItemSelected(item);
}

}


Solution

  • I had this wrong condition in the if statement (convertView != null) to (converView == null)

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
    
    
        if (convertView == null) {
            convertView = inflater.inflate(R.layout.custom_row,null);
        }