【问题标题】:Invalid index 3 size is 3 in AsyncTaskAsyncTask 中的无效索引 3 大小为 3
【发布时间】:2016-03-31 09:08:43
【问题描述】:

我正在使用AsyncTask 来检查Fragment 是否已被替换。发生此错误时会出现问题,因为我没有使用ArrayList。 崩溃很少发生,并且发生在循环中的 AsyncTask 内。

这是错误:

java.lang.RuntimeException: An error occurred while executing doInBackground()
    at android.os.AsyncTask$3.done(AsyncTask.java:309)
    at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:354)
    at java.util.concurrent.FutureTask.setException(FutureTask.java:223)
    at java.util.concurrent.FutureTask.run(FutureTask.java:242)
    at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:234)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
    at java.lang.Thread.run(Thread.java:818)
  Caused by: java.lang.IndexOutOfBoundsException: Invalid index 3, size is 3
    at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:255)
    at java.util.ArrayList.get(ArrayList.java:308)
    at android.support.v4.app.FragmentManagerImpl.findFragmentById(FragmentManager.java:1446)
    at com.runator.ui.newdesign.MainActivity$WaitForChangeFragment.doInBackground(MainActivity.java:1035)
    at com.runator.ui.newdesign.MainActivity$WaitForChangeFragment.doInBackground(MainActivity.java:1027)
    at android.os.AsyncTask$2.call(AsyncTask.java:295)

这是发生错误的代码:

@Override
protected String doInBackground(String... params) {
    Fragment auxCurrentFragment = getSupportFragmentManager().findFragmentById(ID_FRAME_LAYOUT);

    while (auxCurrentFragment instanceof FilterNavigationFragment) {
        auxCurrentFragment = getSupportFragmentManager().findFragmentById(ID_FRAME_LAYOUT);
    }

    return "Executed";

}

只有我这样说: auxCurrentFragment = getSupportFragmentManager().findFragmentById(ID_FRAME_LAYOUT);

如果有任何想法请帮助我,在此先感谢。

【问题讨论】:

  • 记住索引计数从索引 0 开始
  • 我认为他指出的事实是,错误消息说明了实际问题是什么:请求大小为 3 的 ArrayList 以返回索引为 3 的项目 - 这是不可能的,因为索引从 " 0”。所以最高索引是“2”。但这对你没有帮助。不知何故,片段管理器似乎将 ID 映射到内部片段列表的索引 3。所以错误在于没有更新这个。
  • 但是你在哪里看到索引?我只看到 ID
  • @KonstantinsBogdanovs 在堆栈跟踪中:“无效索引 3,大小为 3”
  • :) 欢迎来到多线程世界!

标签: java android android-fragments android-asynctask indexoutofboundsexception


【解决方案1】:

看起来问题出在 supportFragmentMannager 中:

 public Fragment findFragmentById(int id) {
    if (mAdded != null) {
        // First look through added fragments.
        for (int i=mAdded.size()-1; i>=0; i--) {
            Fragment f = mAdded.get(i);
            if (f != null && f.mFragmentId == id) {
                return f;
            }
        }
    }
    if (mActive != null) {
        // Now for any known fragment.
        for (int i=mActive.size()-1; i>=0; i--) {
            Fragment f = mActive.get(i);
            if (f != null && f.mFragmentId == id) {
                return f;
            }
        }
    }
    return null;
}

如果您在主线程中调用findFragmentByIdnot,则片段的计数可能会在调用期间更改。您可以尝试在主线程中调用该方法。

您可以使用YourActivity.this.runOnUiThread 或任一处理程序:

        new AsyncTask<Void, String, String>() {
        @Override
        protected String doInBackground(Void... params) {
            final int ID_FRAME_LAYOUT = 0;
            final Fragment[] auxCurrentFragment = {getSupportFragmentManager().findFragmentById(ID_FRAME_LAYOUT)};

            while (auxCurrentFragment[0] instanceof FilterNavigationFragment) {
                YourActivity.this.runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        auxCurrentFragment[0] = getSupportFragmentManager().findFragmentById(ID_FRAME_LAYOUT);
                    }
                });
                try {
                    Thread.sleep(500);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }

            return "Executed";
        }
    };

【讨论】:

  • 嗯,但这会阻塞主线程,因为他正在旋转检查要替换的片段......
  • 也许你应该更好地使用 thred 而不是 AsyncTask
  • 我不确定你在做什么也许你可以使用developer.android.com/intl/ru/reference/android/view/…解决你的问题
  • 我勾选了这个选项 :)
  • 目前有效!我会继续测试更多!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-30
  • 2018-07-23
  • 1970-01-01
  • 2019-08-26
  • 1970-01-01
  • 2020-08-12
相关资源
最近更新 更多