Java – volley – How to return an ArrayList from the OnResponse method in Volley

volley – How to return an ArrayList from the OnResponse method in Volley… here is a solution to the problem.

volley – How to return an ArrayList from the OnResponse method in Volley

I’m using Volley to parse movie details from a REST api and save the parsed data in an array list of objects called detailsMovies. But I can’t access the ArrayList outside of the onResponse method. I’m new to Android, so I don’t know what to do.
Thanks for your help!

The code is as follows: ‘

    public class MovieDetailsActivity extends AppCompatActivity {
    TextView movieIdText;
    private VolleySingleton volleySingleton;
    private RequestQueue mRequestQueue;
    private ArrayList<MovieDetails> detailsMovies = new ArrayList<>();
    private String movieTitle ;
    private String movieSummary ;
    private int movieYear;
    private long movieRating;
    private String movieYoutubeId;
    private String movieUrlThumbnail;
    private String movieDownloadLink720p;
    private String movieQuality720p;
    private String moviefileSize720p;
    private String movieDownloadLink1080p;
    private String movieQuality1080p;
    private String moviefileSize1080p;

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_movie_details);
        Intent i = getIntent();
        String movieId = i.getExtras().getString("movieId");
        volleySingleton = VolleySingleton.getsInstance();
        mRequestQueue = VolleySingleton.getmRequestQueue();
        parseMovieDetails();

}

public void  parseMovieDetails(){

JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(Request.Method.GET, getUrl(100), new Response.Listener<JSONObject>() {
            @Override
            public void onResponse(JSONObject response) {
                MovieDetails movieDetails = new MovieDetails();
                if (response == null || response.length() == 0) {
                    Toast.makeText(getApplicationContext(), "Null Object", Toast.LENGTH_LONG).show();
                }

try {

JSONObject movieData = response.getJSONObject("data");
                    JSONObject movieDetailsObject = movieData.getJSONObject(Keys.EndPointMovieDetails.KEYS_MOVIE);
                    String movieTitle = movieDetailsObject.getString(Keys.EndPointMovieDetails.KEYS_TITLE_LONG);
                    long movieRating = movieDetailsObject.getInt(Keys.EndPointMovieDetails.KEYS_RATING);
                    String movieSynopsis = movieDetailsObject.getString(Keys.EndPointMovieDetails.KEYS_DESCRIPTION);
                    String moviePosterUrl = movieDetailsObject.getString(Keys.EndPointMovieDetails.KEYS_COVER);
                    String movieYoutubeId = movieDetailsObject.getString(Keys.EndPointMovieDetails.KEY_YOUTUBE_ID);
                    movieDetails.setTitle(movieTitle);
                    movieDetails.setRating(movieRating);
                    movieDetails.setSummary(movieSynopsis);
                    movieDetails.setUrlThumbnail(moviePosterUrl);
                    movieDetails.setYoutube_id(movieYoutubeId);
                    detailsMovies.add(movieDetails);

JSONArray torrentDownloadLinks = movieDetailsObject.getJSONArray(Keys.EndPointMovieDetails.KEYS_TORRENTS);
                    for(int i=0; i<torrentDownloadLinks.length(); i++) {
                        JSONObject urlInfo = torrentDownloadLinks.getJSONObject(i);
                        String urlTorrent = urlInfo.getString("url");
                        String quality = urlInfo.getString("quality");
                        String fileSize = urlInfo.getString("size");

movieDetails.setDownloadLink(urlTorrent);
                        movieDetails.setQuality(quality);
                        movieDetails.setFileSize(fileSize);
                        detailsMovies.add(movieDetails);
                    }

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

}

}, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {

}
        });
        mRequestQueue.add(jsonObjectRequest);

}

public String getUrl(int movieId){
        return UrlEndPoints.URL_MOVIE_DETAILS+
                UrlEndPoints.URl_CHAR_QUESTION+
                UrlEndPoints.URL_PARAM_ID+movieId;
    }

Solution

Define an interface in your class and implement it.
So the simple trick here is an interface with callbacks.

public class MovieDetailsActivity extends AppCompatActivity { 
TextView movieIdText;
private VolleySingleton volleySingleton;
private RequestQueue mRequestQueue;
private ArrayList<MovieDetails> detailsMovies = new ArrayList<>();

@Override 
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_movie_details);
    Intent i = getIntent();
    String movieId = i.getExtras().getString("movieId");
    volleySingleton = VolleySingleton.getsInstance();
    mRequestQueue = VolleySingleton.getmRequestQueue();
    parseMovieDetails(new CallBack() {
        @Override
        public void onSuccess(ArrayList<MovieDetails> detailsMovies) {
           Do Stuff
        }

@Override
        public void onFail(String msg) {
             Do Stuff
        }
    }); 

} 

public void  parseMovieDetails(final CallBack onCallBack){ 

JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(Request.Method.GET, getUrl(100), new Response.Listener<JSONObject>() {
        @Override 
        public void onResponse(JSONObject response) {
            MovieDetails movieDetails = new MovieDetails();
            if (response == null || response.length() == 0) {
                Toast.makeText(getApplicationContext(), "Null Object", Toast.LENGTH_LONG).show();
            } 

try { 

JSONObject movieData = response.getJSONObject("data");
                JSONObject movieDetailsObject = movieData.getJSONObject(Keys.EndPointMovieDetails.KEYS_MOVIE);
                String movieTitle = movieDetailsObject.getString(Keys.EndPointMovieDetails.KEYS_TITLE_LONG);
                long movieRating = movieDetailsObject.getInt(Keys.EndPointMovieDetails.KEYS_RATING);
                String movieSynopsis = movieDetailsObject.getString(Keys.EndPointMovieDetails.KEYS_DESCRIPTION);
                String moviePosterUrl = movieDetailsObject.getString(Keys.EndPointMovieDetails.KEYS_COVER);
                String movieYoutubeId = movieDetailsObject.getString(Keys.EndPointMovieDetails.KEY_YOUTUBE_ID);
                movieDetails.setTitle(movieTitle);
                movieDetails.setRating(movieRating);
                movieDetails.setSummary(movieSynopsis);
                movieDetails.setUrlThumbnail(moviePosterUrl);
                movieDetails.setYoutube_id(movieYoutubeId);
                detailsMovies.add(movieDetails);

JSONArray torrentDownloadLinks = movieDetailsObject.getJSONArray(Keys.EndPointMovieDetails.KEYS_TORRENTS);
                for(int i=0; i<torrentDownloadLinks.length(); i++) {
                    JSONObject urlInfo = torrentDownloadLinks.getJSONObject(i);
                    String urlTorrent = urlInfo.getString("url");
                    String quality = urlInfo.getString("quality");
                    String fileSize = urlInfo.getString("size");

movieDetails.setDownloadLink(urlTorrent);
                    movieDetails.setQuality(quality);
                    movieDetails.setFileSize(fileSize);
                    detailsMovies.add(movieDetails);
                } 
               onCallBack.success(detailsMovies);

} catch (JSONException e) {

e.printStackTrace();
                onCallBack.onFail(e.toString());
            } 

} 

}, new Response.ErrorListener() {
        @Override 
        public void onErrorResponse(VolleyError error) {

} 
    }); 
    mRequestQueue.add(jsonObjectRequest);

} 

public String getUrl(int movieId){
    return UrlEndPoints.URL_MOVIE_DETAILS+ 
            UrlEndPoints.URl_CHAR_QUESTION+ 
            UrlEndPoints.URL_PARAM_ID+movieId;
} 

public interface CallBack {
    void onSuccess(ArrayList<MovieDetails> detailsMovies);

void onFail(String msg);
}

Related Problems and Solutions