0

I am trying to parse data from json using an API, but I don't know for what reasons when I am calculating the size of m_name3 it is showing 0 but the data is being parsed through the file. When putting toast at String name = o.getString("name"); it is showing the content of name string, so this means it is parsing the data but not storing in arraylist. I don't know why. Please help!

package com.example.amitc.pvrathome;
import android.app.ProgressDialog;
import android.app.SearchManager;
import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;

import com.android.volley.Request;
import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.StringRequest;
import com.android.volley.toolbox.Volley;
import com.bumptech.glide.Glide;
import com.bumptech.glide.request.RequestOptions;
import com.bumptech.glide.request.target.SimpleTarget;
import com.bumptech.glide.request.transition.Transition;

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.URL;
import java.util.ArrayList;

import okhttp3.OkHttpClient;

public class msms extends AppCompatActivity {
    String img_src;
    private ArrayList<String> m_name3 = new ArrayList<>();
    private ArrayList<String> m_release_year3 = new ArrayList<>();
    private ArrayList<String> m_genre3 = new ArrayList<>();
    private ArrayList<String> m_director3 = new ArrayList<>();
    private ArrayList<String> m_rating3 = new ArrayList<>();
    private ArrayList<String> m_actor3 = new ArrayList<>();
    private ArrayList<String> m_desc3 = new ArrayList<>();
    private ArrayList<String> m_imgsrc3 = new ArrayList<>();
    StringRequest stringRequest;
    Context mContext;
    String url_all = "https://www.dropbox.com/s/ofzv2j16vq9ofmq/100MovieList.json?dl=1";

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

        new getIncomingIntent().execute();

        ImageView imageView = findViewById(R.id.msms_image);

        mContext = this;

        Glide.with(this)
                .load(img_src)
                .apply(new RequestOptions()
                        .placeholder(R.drawable.rec)
                        .dontAnimate()
                        .error(R.drawable.movies))
                .into(imageView);

        Intent intent = getIntent();
        if (Intent.ACTION_SEARCH.equals(intent.getAction())) {
            String query = intent.getStringExtra(SearchManager.QUERY);
            //txt.setText("Searching by: "+ query);

        } else if (Intent.ACTION_VIEW.equals(intent.getAction())) {

            String uri = intent.getDataString();
            final int index = Integer.parseInt(uri.replaceAll("[^0-9]", ""));
            //


            stringRequest = new StringRequest(Request.Method.GET,
                    url_all,
                    new Response.Listener<String>() {
                        @Override
                        public void onResponse(String s) {
                            try {
                                JSONObject jsonObject = new JSONObject(s);
                                JSONArray array = jsonObject.getJSONArray("movies");

                                for (int i = 0; i < array.length(); i++) {
                                    JSONObject o = array.getJSONObject(i);
                                    String name = o.getString("name");
                                    String year = o.getString("year");
                                    String genre = o.getString("genre");
                                    String rating = o.getString("rating");
                                    String director = o.getString("directors_name");
                                    String actor = o.getString("cast");
                                    String img_src = o.getString("poster_src");
                                    String desc = o.getString("description");

                                    m_name3.add(name);
                                    m_release_year3.add(year);
                                    m_genre3.add(genre);
                                    m_rating3.add(rating);
                                    m_director3.add(director);
                                    m_actor3.add(actor);
                                    m_imgsrc3.add(img_src);
                                    m_desc3.add(desc);
                                }
                            } catch (JSONException e) {
                                e.printStackTrace();
                            }
                        }
                    },
                    new Response.ErrorListener() {
                        @Override
                        public void onErrorResponse(VolleyError error) {
                            Toast.makeText(getApplicationContext(), "Some error Occured", Toast.LENGTH_SHORT).show();
                        }
                    });

            RequestQueue requestQueue = Volley.newRequestQueue(msms.this);
            requestQueue.add(stringRequest);

            Toast.makeText(this, "Index: "+ m_name3.size(), Toast.LENGTH_SHORT).show();

//            TextView m_name = findViewById(R.id.msms_name);
//            m_name.setText(m_name3.get(index));
//
//            TextView m_name1 = findViewById(R.id.msms_name1);
//            m_name1.setText(m_name3.get(index));
//            //        TextView m_year = (TextView) findViewById(R.id.msms_year);
//            //        m_year.setText(year);
//
//            TextView m_genre = findViewById(R.id.msms_genre);
//            m_genre.setText(m_genre3.get(index));
//
//            TextView m_rating = findViewById(R.id.msms_rating);
//            m_rating.setText(m_rating3.get(index));
//
//            TextView m_desc = findViewById(R.id.msms_desc);
//            m_desc.setText(m_desc3.get(index));
//
//            TextView m_direc = findViewById(R.id.msms_direc);
//            m_direc.setText(m_director3.get(index));
//
//            TextView m_actor = findViewById(R.id.msms_actor);
//            m_actor.setText(m_actor3.get(index));

//            Glide.with(this)
//                    .load(img_src)
//                    .apply(new RequestOptions()
//                            .placeholder(R.drawable.rec)
//                            .dontAnimate()
//                            .error(R.drawable.movies))
//                    .into(imageView);
        }

    }

    public class getIncomingIntent extends AsyncTask<Void, Void, Void> {

        @Override
        protected Void doInBackground(Void... voids) {
            String name = getIntent().getStringExtra("names");
//            String year = getIntent().getStringExtra("years");
            String genre = getIntent().getStringExtra("genres");
            String rating = getIntent().getStringExtra("ratings");
            String desc = getIntent().getStringExtra("decss");
            String director = getIntent().getStringExtra("direcs");
            String actor = getIntent().getStringExtra("stars");
            img_src = getIntent().getStringExtra("img1");


            TextView m_name = (TextView) findViewById(R.id.msms_name);
            m_name.setText(name);

            TextView m_name1 = (TextView) findViewById(R.id.msms_name1);
            m_name1.setText(name);
            //        TextView m_year = (TextView) findViewById(R.id.msms_year);
            //        m_year.setText(year);

            TextView m_genre = (TextView) findViewById(R.id.msms_genre);
            m_genre.setText(genre);

            TextView m_rating = (TextView) findViewById(R.id.msms_rating);
            m_rating.setText(rating);

            TextView m_desc = (TextView) findViewById(R.id.msms_desc);
            m_desc.setText(desc);

            TextView m_direc = (TextView) findViewById(R.id.msms_direc);
            m_direc.setText(director);

            TextView m_actor = (TextView) findViewById(R.id.msms_actor);
            m_actor.setText(actor);

            return null;
        }
    }
}

EDITED:

package com.example.amitc.pvrathome;

import android.app.ProgressDialog;
import android.app.SearchManager;
import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;

import com.android.volley.Request;
import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.StringRequest;
import com.android.volley.toolbox.Volley;
import com.bumptech.glide.Glide;
import com.bumptech.glide.request.RequestOptions;
import com.bumptech.glide.request.target.SimpleTarget;
import com.bumptech.glide.request.transition.Transition;

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.URL;
import java.util.ArrayList;

import okhttp3.OkHttpClient;

public class msms extends AppCompatActivity {
    String img_src;
    private ArrayList<String> m_name3 = new ArrayList<>();
    private ArrayList<String> m_release_year3 = new ArrayList<>();
    private ArrayList<String> m_genre3 = new ArrayList<>();
    private ArrayList<String> m_director3 = new ArrayList<>();
    private ArrayList<String> m_rating3 = new ArrayList<>();
    private ArrayList<String> m_actor3 = new ArrayList<>();
    private ArrayList<String> m_desc3 = new ArrayList<>();
    private ArrayList<String> m_imgsrc3 = new ArrayList<>();
    StringRequest stringRequest;
    Context mContext;
    String url_all = "https://www.dropbox.com/s/ofzv2j16vq9ofmq/100MovieList.json?dl=1";

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

        new getIncomingIntent().execute();

        ImageView imageView = findViewById(R.id.msms_image);

        mContext = this;

        Glide.with(this)
                .load(img_src)
                .apply(new RequestOptions()
                        .placeholder(R.drawable.rec)
                        .dontAnimate()
                        .error(R.drawable.movies))
                .into(imageView);

        Intent intent = getIntent();
        if (Intent.ACTION_SEARCH.equals(intent.getAction())) {
            String query = intent.getStringExtra(SearchManager.QUERY);
            //txt.setText("Searching by: "+ query);

        } else if (Intent.ACTION_VIEW.equals(intent.getAction())) {

            String uri = intent.getDataString();
            final int index = Integer.parseInt(uri.replaceAll("[^0-9]", ""));
            //


            stringRequest = new StringRequest(Request.Method.GET,
                    url_all,
                    new Response.Listener<String>() {
                        @Override
                        public void onResponse(String s) {
                            try {
                                JSONObject jsonObject = new JSONObject(s);
                                JSONArray array = jsonObject.getJSONArray("movies");

                                for (int i = 0; i < array.length(); i++) {
                                    JSONObject o = array.getJSONObject(i);
                                    String name = o.getString("name");
                                    String year = o.getString("year");
                                    String genre = o.getString("genre");
                                    String rating = o.getString("rating");
                                    String director = o.getString("directors_name");
                                    String actor = o.getString("cast");
                                    String img_src = o.getString("poster_src");
                                    String desc = o.getString("description");

                                    m_name3.add(name);
                                    m_release_year3.add(year);
                                    m_genre3.add(genre);
                                    m_rating3.add(rating);
                                    m_director3.add(director);
                                    m_actor3.add(actor);
                                    m_imgsrc3.add(img_src);
                                    m_desc3.add(desc);
                                }

                                ProgressDialog progress;
                                progress= new ProgressDialog(mContext);
                                progress.setMessage("Loading...");
                                progress.show();

                                TextView m_name = findViewById(R.id.msms_name);
                                m_name.setText(m_name3.get(index));

                                TextView m_name1 = findViewById(R.id.msms_name1);
                                m_name1.setText(m_name3.get(index));
                                //        TextView m_year = (TextView) findViewById(R.id.msms_year);
                                //        m_year.setText(year);

                                TextView m_genre = findViewById(R.id.msms_genre);
                                m_genre.setText(m_genre3.get(index));

                                TextView m_rating = findViewById(R.id.msms_rating);
                                m_rating.setText(m_rating3.get(index));

                                TextView m_desc = findViewById(R.id.msms_desc);
                                m_desc.setText(m_desc3.get(index));

                                TextView m_direc = findViewById(R.id.msms_direc);
                                m_direc.setText(m_director3.get(index));

                                TextView m_actor = findViewById(R.id.msms_actor);
                                m_actor.setText(m_actor3.get(index));

                                ImageView imageView = findViewById(R.id.msms_image);

                                Glide.with(getApplicationContext())
                                            .load(img_src)
                                            .apply(new RequestOptions()
                                                    .placeholder(R.drawable.rec)
                                                    .dontAnimate()
                                                    .error(R.drawable.movies))
                                            .into(imageView);

                                progress.dismiss();
                            } catch (JSONException e) {
                                e.printStackTrace();
                            }
                        }
                    },
                    new Response.ErrorListener() {
                        @Override
                        public void onErrorResponse(VolleyError error) {
                            Toast.makeText(getApplicationContext(), "Some error Occured", Toast.LENGTH_SHORT).show();
                        }
                    });

            RequestQueue requestQueue = Volley.newRequestQueue(msms.this);
            requestQueue.add(stringRequest);
        }

    }

    public class getIncomingIntent extends AsyncTask<Void, Void, Void> {

        @Override
        protected Void doInBackground(Void... voids) {
            String name = getIntent().getStringExtra("names");
//            String year = getIntent().getStringExtra("years");
            String genre = getIntent().getStringExtra("genres");
            String rating = getIntent().getStringExtra("ratings");
            String desc = getIntent().getStringExtra("decss");
            String director = getIntent().getStringExtra("direcs");
            String actor = getIntent().getStringExtra("stars");
            img_src = getIntent().getStringExtra("img1");


            TextView m_name = (TextView) findViewById(R.id.msms_name);
            m_name.setText(name);

            TextView m_name1 = (TextView) findViewById(R.id.msms_name1);
            m_name1.setText(name);
            //        TextView m_year = (TextView) findViewById(R.id.msms_year);
            //        m_year.setText(year);

            TextView m_genre = (TextView) findViewById(R.id.msms_genre);
            m_genre.setText(genre);

            TextView m_rating = (TextView) findViewById(R.id.msms_rating);
            m_rating.setText(rating);

            TextView m_desc = (TextView) findViewById(R.id.msms_desc);
            m_desc.setText(desc);

            TextView m_direc = (TextView) findViewById(R.id.msms_direc);
            m_direc.setText(director);

            TextView m_actor = (TextView) findViewById(R.id.msms_actor);
            m_actor.setText(actor);

            return null;
        }
    }
}

1 Answers1

0

Since your stringRequest runs on a different thread, you can't be sure if you already have the response by the time you are showing the toast, so you should have a look at the size only after you have the response.

In short, move the toast inside of onResponse:

stringRequest = new StringRequest(Request.Method.GET,
                url_all,
                new Response.Listener<String>() {
                    @Override
                    public void onResponse(String s) {
                        try {
                            JSONObject jsonObject = new JSONObject(s);
                            JSONArray array = jsonObject.getJSONArray("movies");

                            for (int i = 0; i < array.length(); i++) {
                                JSONObject o = array.getJSONObject(i);
                                String name = o.getString("name");
                                String year = o.getString("year");
                                String genre = o.getString("genre");
                                String rating = o.getString("rating");
                                String director = o.getString("directors_name");
                                String actor = o.getString("cast");
                                String img_src = o.getString("poster_src");
                                String desc = o.getString("description");

                                m_name3.add(name);
                                m_release_year3.add(year);
                                m_genre3.add(genre);
                                m_rating3.add(rating);
                                m_director3.add(director);
                                m_actor3.add(actor);
                                m_imgsrc3.add(img_src);
                                m_desc3.add(desc);
                            }

                            Toast.makeText(msms.this, "Index: "+ m_name3.size(), Toast.LENGTH_SHORT).show();

                        } catch (JSONException e) {
                            e.printStackTrace();
                        }
                    }
                },
                new Response.ErrorListener() {
                    @Override
                    public void onErrorResponse(VolleyError error) {
                        Toast.makeText(getApplicationContext(), "Some error Occured", Toast.LENGTH_SHORT).show();
                    }
                });
Onur D.
  • 515
  • 3
  • 11
  • 1
    using `this` as the context will not work for the Toast, because it's inside a callback – MatPag Oct 08 '18 at 19:54
  • Thanks a lot sirr all problems resolved. I was actually trying to setText below this code but actually it should be done inside try block. But sir why I am not able to access anything from arraylist outside block? – Amit Chaudhary Oct 08 '18 at 20:03
  • Yeah I am using Context as a reference – Amit Chaudhary Oct 08 '18 at 20:03
  • Sir now how can I use glide in this coz pic is not showing? – Amit Chaudhary Oct 08 '18 at 20:15
  • @AmitChaudhary it's not like you can't access them. It is a matter of when to access them. When you make a request using Volley, you don't know when it'll finish. So you need to make sure your Volley task is finished before you ask for the result of it. Here in your code, onResponse() method gets called right when you have a response so it is a nice spot to ask for the size of your resulting list. I'd suggest learn more about threads & parallelism in programming :) Happy coding. – Onur D. Oct 08 '18 at 20:19