Why I am getting null value from list which is passed from another Activity?

Shibu Prasad :

In my project, I am calling themoviedb api and onResponse , i want to share the List to other Activity. When I am passing , I am getting null value from List in other Activity.

Here is my MainActivity.class file :-

Intent intent;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    intent = new Intent(this, SecondActivity.class);
    fetchMovieTrailers(5);
    startActivity(intent); 
}
public void fetchMovieTrailers(int id){
    final Retrofit retrofit = new Retrofit.Builder()
             .baseUrl(BASE_URL)
             .addConverterFactory(GsonConverterFactory.create())
             .build();

    MovieApiInterface apiInterface = retrofit
             .create(MovieApiInterface.class);

    Call<MovieTrailer> movieTrailerCall = apiInterface
             .getListOfMovieTrailers(id, API_KEY);

    movieTrailerCall.enqueue(new Callback<MovieTrailer>() {
         @Override
         public void onResponse(Call<MovieTrailer> call, Response<MovieTrailer> response) {
             MovieTrailer movieTrailer = response.body();
             List<MovieTrailer.ResultsBean> listOfMovies = movieTrailer.getResults();
             ArrayList<String> trailerKeyList = new ArrayList<>();
             for (int i=0; i<listOfMovies.size(); i++){
                 trailerKeyList.add(listOfMovies.get(i).getKey());
                 Log.d("Trailer Key : ", trailerKeyList.get(i)+"");
             }
              intent.putStringArrayListExtra("Trailer Keys", trailerKeyList);
           }

           @Override
           public void onFailure(Call<MovieTrailer> call, Throwable t) {
                t.printStackTrace();
           }
       });
 }

In Second Activity :-

ArrayList<String> listOfTrailers = getIntent().getStringArrayListExtra("Trailers Key");
Log.d("Second Activity", listOfTrailers+"");  // I am getting null here
Zain :

Your intent data depends on the API response which is not guaranteed, or you can't expect when it occurs, so you need to postpone the startActivity() until you get the API response

To do so, move the startActivity(intent); to the line after intent.putStringArrayListExtra("Trailer Keys", trailerKeyList);

So your code will be:

Intent intent;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    intent = new Intent(this, SecondActivity.class);
    fetchMovieTrailers(5);

}
public void fetchMovieTrailers(int id){
    final Retrofit retrofit = new Retrofit.Builder()
             .baseUrl(BASE_URL)
             .addConverterFactory(GsonConverterFactory.create())
             .build();

    MovieApiInterface apiInterface = retrofit
             .create(MovieApiInterface.class);

    Call<MovieTrailer> movieTrailerCall = apiInterface
             .getListOfMovieTrailers(id, API_KEY);

    movieTrailerCall.enqueue(new Callback<MovieTrailer>() {
         @Override
         public void onResponse(Call<MovieTrailer> call, Response<MovieTrailer> response) {
             MovieTrailer movieTrailer = response.body();
             List<MovieTrailer.ResultsBean> listOfMovies = movieTrailer.getResults();
             ArrayList<String> trailerKeyList = new ArrayList<>();
             for (int i=0; i<listOfMovies.size(); i++){
                 trailerKeyList.add(listOfMovies.get(i).getKey());
                 Log.d("Trailer Key : ", trailerKeyList.get(i)+"");
             }
              intent.putStringArrayListExtra("Trailer Keys", trailerKeyList);
              startActivity(intent);
           }

           @Override
           public void onFailure(Call<MovieTrailer> call, Throwable t) {
                t.printStackTrace();
           }
       });
 }

Guess you like

Origin http://43.154.161.224:23101/article/api/json?id=360187&siteId=1