2016-02-22 4 views
2

Я использую volley для разбора данных фильма из REST api, и я сохраняю проанализированные данные в Arraylist объектов, которые называются detailsMovies. Но я не могу получить доступ к ArrayList вне метода onResponse. Я новичок в Android. Поэтому я не знаю, что делать. Любая помощь приветствуется!volley- Как вернуть ArrayList из метода OnResponse в Volley

Вот код: `

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; 
    } 
+0

вы можете легко получить доступ, почему вы не можете получить доступ? Вы создали переменную member detailsMovies и она доступна. –

+0

Я могу получить к нему доступ, но значение всегда равно – RoshanPisharody

+0

доступ только после успешного завершения jsonObjectRequest до этого вы ничего не получите –

ответ

4

определить интерфейс в своем классе и осуществить это.
Итак, простой трюк - это интерфейс с обратным вызовом.

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); 
} 
+0

Почему мы используем интерфейсы в Android? Есть ли другой способ сделать то же самое? – Dennis

Смежные вопросы