经过3个小时的尝试,我决定在这里问一下,看看是否有人能为我提供这个错误的解决方案:java.lang.IndexOutOfBoundsException:索引4无效,大小为4
这是我的代码。
private ProgressBar progressBar;
private int progressStatus = 0;
private Handler handler = new Handler();
--------------------
status.setText(getString(R.string.init));
progressBar.setVisibility(View.VISIBLE);
final Map<String,?> keys = prefs.getAll(); //4 prefs atm inside.
final ArrayList<String> props = new ArrayList<String>();
final ArrayList<String> values = new ArrayList<String>();
if (keys != null) {
for(final Map.Entry<String,?> entry : keys.entrySet()) {
props.add(entry.getKey());
values.add(entry.getValue().toString());
}
final int total = props.size();
progressBar.setMax(total);
new Thread(new Runnable() {
public void run() {
while (progressStatus < total) {
progressStatus += 1;
handler.post(new Runnable() {
public void run() {
progressBar.setProgress(progressStatus);
if (props.get(progressStatus) != null) {
writeProps(props.get(progressStatus), values.get(progressStatus));
status.setText(getString(R.string.writing) + ": " + props.get(progressStatus));
}
}
});
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
} while (progressStatus == total) {
handler.post(new Runnable() {
public void run() {
progressBar.setVisibility(View.GONE);
progressStatus = total + 1;
myVoidOnFinish();
}
});
}
}
}).start();
}
我被困在这里:
writeProps(props.get(progressStatus), values.get(progressStatus));
status.setText(getString(R.string.writing) + ": " + props.get(progressStatus));
答案 0 :(得分:1)
主要问题在这里
while (progressStatus < total) {
progressStatus += 1;
}
检查进度状态的值,它应该不大于3,而在你的代码中它最后是4而索引只是从0到3.请相应地设置进度状态的值。
试试这个
while (progressStatus < total-1) {
progressStatus += 1;
}
答案 1 :(得分:1)
问题是您正在设置progressstatus值,如下所示
final int total = props.size();
progressBar.setMax(total);
并且您在以下行中尝试获取道具ase的值
writeProps(props.get(progressStatus), values.get(progressStatus));
看到总大小为4,你的progressStatus将是4.但是道具和值的最大索引将是3.所以这就是问题
您可以将值设置为小于
之类的大小 final int total = props.size() - 1;
答案 2 :(得分:0)
你正在使用一个额外的索引,因为你可以使用最多3个。所以请从零开始并使用less然后检查而不是小于等于。