не может получить ArrayList вне цикла for в call.enqueue - PullRequest
2 голосов
/ 27 июня 2019

Я хочу получить данные ArrayList из цикла for из метода call.enqueue в Retrofit.

как получить доступ к спискам вне call.enqueue mehtod?

Все работает нормально. При печати размера списка я получаю значение, которое я хочу. Единственная проблема в том, что я не могу получить доступ к значениям извне метода call.enqueue.

private void getSchoolList() {
    final Call<List<DanceSchool>> call = RetrofitClient.getInstance().getApi().getDanceSchools();


    call.enqueue(new Callback<List<DanceSchool>>() {
        @Override
        public void onResponse(Call<List<DanceSchool>> call, Response<List<DanceSchool>> response) {
            if(!response.isSuccessful()) {
                Toast.makeText(ListActivity.this, "Response Code: " + response.code(), Toast.LENGTH_SHORT).show();
            }

            List<DanceSchool> danceSchools = response.body();



            for(DanceSchool danceSchool:danceSchools){

                schoolNameList.add(danceSchool.getSchool_name());
                dayList.add(danceSchool.getDays());
                timingList.add(danceSchool.getSun_timing());
                contactNoList.add(danceSchool.getContact_no());
                addressList.add(danceSchool.getAddress());

            }


        }

        @Override
        public void onFailure(Call<List<DanceSchool>> call, Throwable t) {
            Toast.makeText(ListActivity.this, "Failure: "+t.getMessage(), Toast.LENGTH_SHORT).show();

        }
    });

}

Я хочу получить доступ к ArrayList вне метода call.enqueue.

Ответы [ 2 ]

5 голосов
/ 27 июня 2019

Самый простой способ - объявить функцию

void accessArrayList(ArrayList<DanceSchool> danceSchool){
    //do stuff with the values
}

и вызвать ее внутри call.enqueue

call.enqueue(new Callback<List<DanceSchool>>() {
    @Override
    public void onResponse(....) {
        ........
        List<DanceSchool> danceSchools = response.body();
        accessArrayList(danceSchools);
        .......
    }
}
2 голосов
/ 27 июня 2019

Дело в том, что сейчас вы делаете асинхронный вызов. Вы запрашиваете некоторую информацию, и когда эта информация была скомпилирована и готова , то вызывает метод onResponse(). Только затем этот список может быть заполнен из тела входящего ответа.

Итак, что вы можете сделать: иметь другой метод в вашем классе включения, например, updateList(), а затем просто вызвать этот метод из вашей реализации onResponse().

Кроме того, вы можете захотеть превратить ваш асинхронный вызов в синхронный. Затем вместо этого вы используете execute() для ожидания получения результата (см., Например, здесь ). Но вам все равно нужно иметь метод обратного вызова для вызова.

В качестве альтернативы, вы можете иметь поле внутри класса, например

List<DanceSchool> danceSchools
...
private void getSchoolList() {
  final Call<List<DanceSchool>> call = ...    
  call.enqueue(new Callback<List<DanceSchool>>() {
    @Override
    public void onResponse(Call<List<DanceSchool>> call, Response<List<DanceSchool>> response) {
    ...
    danceSchools.addAll(response.body());
...