用来自response.body的对象填充ArrayList

时间:2019-02-08 12:34:44

标签: java android arraylist request retrofit

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

  

无法开始活动... IndexOutOfBoundsException:索引0,大小0

界面

 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());
    }
}

onResponse方法中的字符串tv1.setText(cityList.get(i).getName());运行良好。但是当我用方法写出来的时候,乘法运算就失败了

1 个答案:

答案 0 :(得分:2)

可以看出,您在后台线程中运行代码,而下面的几行尝试更新UI线程上的textview。
后台操作将花费一些时间,因此,当您尝试更新TextView时,cityList为空。
考虑在此处阅读更多内容:Consuming apis with retrofit