Android Fragment调用WebService后出现数组越界异常求助
解决Fragment中WebService回调后列表数组越界的问题
我来帮你分析下这个问题哈,你遇到的情况是:在WebService的onSuccess方法里能正常打印有有效值的bankRanking列表,但回调执行完成后再访问该列表就触发数组下标越界异常,大概率是以下几个原因导致的:
可能的原因
- 列表引用被意外重置:比如在
onSuccess之后,Fragment的某个生命周期方法(比如onResume、onCreateView)里又重新执行了bankRanking = new ArrayList<>();,把原来持有有效数据的列表引用覆盖成了新的空列表,这时再访问下标自然会越界。 - 后续代码对列表做了清空/删除操作:
onSuccess执行完成后,可能有其他逻辑调用了bankRanking.clear()、bankRanking.remove()这类方法,导致列表变为空或者元素数量减少,而你访问下标时没做判断。 - 下标访问逻辑错误:比如你用了
bankRanking.get(bankRanking.size())这种错误的下标(数组下标从0开始,最大下标是size()-1),哪怕列表有值也会触发越界。
解决方案
针对这些可能的问题,你可以按以下步骤排查和修复:
固定列表初始化逻辑,避免重复赋值
把bankRanking的初始化放在Fragment的onCreate方法里,或者只在声明时初始化一次,不要在后续生命周期方法里重新创建新的ArrayList实例:public class BankRatingOffsiteIndustry extends Fragment { // 只初始化一次,确保引用不会被意外替换 private List<BankRankingDTO> bankRanking = new ArrayList<>(); @Override public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); // 如果需要在Fragment重建时保留数据,可以加上这句 setRetainInstance(true); } }访问列表前必须判空+校验下标
不管在什么地方访问列表元素,先判断列表是否为空,再确保下标在合法范围内:// 比如你要打印第一个元素 if (!bankRanking.isEmpty() && bankRanking.size() > 0) { Log.d("TAG", bankRanking.get(0).toString()); } else { Log.d("TAG", "列表为空或无足够元素"); }检查异步回调后的列表修改逻辑
排查onSuccess之后的所有代码,看看有没有对bankRanking做清空、删除或者重新赋值的操作。比如如果是在onStop或onDestroyView里重置了列表,那当Fragment回到前台时,原来的有效数据就没了。避免重复发起请求导致的数据混乱
在onStart里发起请求前,先判断列表是否为空,避免每次Fragment进入前台都重复请求,导致回调多次修改列表:@Override public void onStart() { super.onStart(); if (bankRanking.isEmpty()) { RequestParams params = new RequestParams(); params.add("date", "2017-12-31"); params.add("currency", "..."); // 这里是你的WebService请求逻辑 yourWebServiceClient.request(params, new YourCallback() { @Override public void onSuccess(List<BankRankingDTO> data) { // 先清空旧数据,再添加新数据 bankRanking.clear(); bankRanking.addAll(data); Log.d("TAG", "回调内列表大小:" + bankRanking.size()); } }); } }
内容的提问来源于stack exchange,提问作者user6199002
相关产品推荐
相关产品推荐

