Java 用response.body中的对象填充ArrayList

Java 用response.body中的对象填充ArrayList,java,android,arraylist,request,retrofit,Java,Android,Arraylist,Request,Retrofit,我正在使用改型从api获取数据列表。我想保存body.response中获取的数据到arrayList。我可以这样做,并从新的arrayList中获取项目,但新列表似乎没有保存。当我尝试在onResponse方法之外使用它时,我得到一个错误 无法启动活动。。。IndexOutOfBoundsException:索引0,大小为0 接口 public interface ServerApi { @Headers("Accept: application/json")

我正在使用改型从api获取数据列表。我想保存body.response中获取的数据到arrayList。我可以这样做,并从新的arrayList中获取项目,但新列表似乎没有保存。当我尝试在onResponse方法之外使用它时,我得到一个错误

无法启动活动。。。IndexOutOfBoundsException:索引0,大小为0

接口

 public interface ServerApi {
        @Headers("Accept: application/json")
        @GET("cities")
        Call<ArrayList<City>> getCities();
    }
公共接口服务器API{
@标题(“接受:应用程序/json”)
@获取(“城市”)
调用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());
    }
}
public类SomeActivity扩展了AppCompatActivity{
改装改装=新改装.Builder()
.baseUrl(“http://url")
.addConverterFactory(GsonConverterFactory.create())
.build();
ServerApi ServerApi=reformation.create(ServerApi.class);
ArrayList cityList=新的ArrayList();
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(右布局、活动和停车场);
最终文本视图tv1=findViewById(R.id.tv1);
最终调用cities=serverApi.getCities();
cities.enqueue(新回调(){
@凌驾
公共void onResponse(调用、响应){

对于(int i=0;i可以看出,您在后台线程中运行代码,下面几行尝试在UI线程上更新textview。
后台操作需要一些时间,因此,当您尝试更新TextView时,cityList为空。

考虑在这里阅读更多内容:

,因为可以看到您在后台线程中运行代码,下面几行尝试在UI线程上更新您的文本视图。 后台操作需要一些时间,因此,当您尝试更新TextView时,cityList为空。

考虑一下这里的内容:

我不确定100%,但是我认为队列是在后台线程上运行的。在你写C1.SET文本的时候,CITYLIST是空的。这是我首先要检查的。首先,队列异步运行。CITYLIST在尝试访问CITYLIST时没有条目。GET(0)您必须在一个单独的方法中移动依赖于arraylist的代码,并在收到响应后调用它。如上面的注释所述,当您对其调用方法时,您的列表是空的。我不是100%确定,但我认为enqueue是在后台线程上运行的。当您编写c1.setText时,cityList是空的。这是第一个t我想检查一下。首先,排队是异步运行的。当您尝试访问cityList时,cityList没有任何项。get(0)您必须在单独的方法中移动依赖于arraylist的代码,并在收到响应后调用它。如上面的注释所述,当您对其调用方法时,列表是空的。