Заполните ArrayList объектом из response.body - PullRequest
0 голосов
/ 08 февраля 2019

Я использую модификацию, чтобы получить список данных из API.Я хочу сохранить данные, которые я получаю в body.response для arrayList.Я могу сделать это, и я получаю элементы из нового arrayList, но кажется, что новый список не сохраняется.Когда я пытаюсь использовать его вне метода onResponse, я получаю сообщение об ошибке

Невозможно начать действие ... IndexOutOfBoundsException: Index 0, Size 0

Interface

 public interface ServerApi {
        @Headers("Accept: application/json")
        @GET("cities")
        Call<ArrayList<City>> getCities();
    }

Действие

public class SomeActivity extends AppCompatActivity {

    Retrofit retrofit = new Retrofit.Builder()
            .baseUrl("http://url")
            .addConverterFactory(GsonConverterFactory.create())
            .build();

    ServerApi serverApi = retrofit.create(ServerApi.class);

    ArrayList<City> cityList = new ArrayList<City>();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_parkings);

        final TextView tv1 = findViewById(R.id.tv1);

        final Call<ArrayList<City>> cities = serverApi.getCities();

        cities.enqueue(new Callback<ArrayList<City>>() {
            @Override
            public void onResponse(Call<ArrayList<City>> call, Response<ArrayList<City>> response) {
                for(int i=0; i<response.body().size(); i++){
                    City ct = new City(response.body().get(i).getId(), response.body().get(i).getName());
                    cityList.add(ct);
                    tv1.setText(cityList.get(i).getName());
                }
            }
            @Override
            public void onFailure(Call<ArrayList<City>> call, Throwable t) {
                tv1.setText("failure " + t);
            }
        });

      TextView c1 = findViewById(R.id.c1);
      c1.setText(cityList.get(0).getName());
    }
}

Строка tv1.setText(cityList.get(i).getName()); внутри метода onResponse работает хорошо.Но когда я пишу это из метода, приложение падает

1 Ответ

0 голосов
/ 08 февраля 2019

Как видно, вы запускаете свой код в фоновом потоке, и несколькими строками ниже вы пытаетесь обновить текстовое представление в потоке пользовательского интерфейса.
Фоновая операция займет некоторое время, поэтому к тому времени, когда вы попытаетесь обновить TextView, cityList будет пустым.
Подумайте о том, чтобы прочитать немного больше здесь: Потребление API с модернизацией

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...