java.lang.IndexOutOfBoundsException ...但为什么呢?

时间:2014-01-15 04:02:23

标签: android arraylist progress-bar

经过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));

3 个答案:

答案 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然后检查而不是小于等于。