Faced the following situation: the method must load data from the server and add it to the ArrayList
. Here is the code:
static List<Film> generateFilms(){ Log.i(Tag, "In generate films"); List <Film> films = new ArrayList<>(); String BaseUrl = "http://www.omdbapi.com/"; Retrofit.Builder builder = new Retrofit.Builder().baseUrl(BaseUrl) .addConverterFactory(GsonConverterFactory.create()); OkHttpClient.Builder httpClient = new OkHttpClient.Builder() .connectTimeout(10, TimeUnit.SECONDS) .writeTimeout(10, TimeUnit.SECONDS) .readTimeout(30, TimeUnit.SECONDS); httpClient.addInterceptor(chain -> { Request original = chain.request(); Request.Builder requestBuilder = original.newBuilder() .header("Authorization", "auth-value"); Request request = requestBuilder.build(); return chain.proceed(request); }); Retrofit retrofit = builder.build(); APIService apiService = retrofit.create(APIService.class); final Call<Film> filmsCall = apiService.getFilms(); filmsCall.enqueue(new Callback<Film>() { @Override public void onResponse(@NonNull Call<Film> call, @NonNull Response<Film> response) { if (response.isSuccessful()){ Film film = response.body(); films.add(film); Log.i(Tag, "Response: "+Objects.requireNonNull(response.body()).getTitle()); } else { Log.i(Tag, "Response code: "+response.code()); } } @Override public void onFailure(@NonNull Call<Film> call, @NonNull Throwable t) { Log.i(getClass().getSimpleName(), "Error: "+t); } }); Log.i(Tag, "Size = "+films.size()); return films; }
But for some reason, the array is returned first and only then the data is added to it. As I understand it, this is due to the fact that the data is received from the server asynchronously. How, then, to fix this problem?