【问题标题】:Getting IndexOutOfBoundException in AsyncTask在 AsyncTask 中获取 IndexOutOfBoundException
【发布时间】:2016-11-07 18:09:51
【问题描述】:

我有一个班级CheckList。它有checkListIdtitleCheckListItemArrayList

我有 2 个异步任务。一个用于GetCheckLists,另一个用于GetCheckListItems。在CheckList 类中,它有checkListIdTitlearrayListcheckListItems

首先,我使用GetCheckListAsyncTask 获取所有检查列表。现在对于每个清单,我都调用GetCheckListItemsAsync 任务来获取所有checkListItems

现在GetCheckListItemsAsyncTaskonPostExecute 方法我想将checkListItemArrayList 设置为CheckList 的对象。

检查列表活动:

public class CheckListActivity extends AppCompatActivity implements CheckListAdapter.OnItemClickListener{

    public int iterationCount = 0;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_check_list);

        mIntent = getIntent();

        checkListArrayList = new ArrayList<>();

        tempCheckListIdList = new ArrayList<>();

        mEventId = mIntent.getStringExtra("eventId");

        mCheckList = new CheckList();

        progressDialog = new ProgressDialog(CheckListActivity.this);

        recyclerView = (RecyclerView)findViewById(R.id.recycler_view);

        mAdapter = new CheckListAdapter(checkListArrayList,CheckListActivity.this,CheckListActivity.this);
        RecyclerView.LayoutManager mLayoutManager = new LinearLayoutManager(getApplicationContext());
        recyclerView.setLayoutManager(mLayoutManager);
        recyclerView.setItemAnimator(new DefaultItemAnimator());
        recyclerView.setAdapter(mAdapter);

        GetCheckListAsyncTask getCheckListAsyncTask = new GetCheckListAsyncTask();
        getCheckListAsyncTask.execute(mEventId);

    }

    public class GetCheckListsItemAsyncTask extends AsyncTask<String, Void, JSONObject> {

        private String api;
        private JSONObject jsonParams;
        public GetCheckListsItemAsyncTask(){}

        @Override
        protected JSONObject doInBackground(String... params) {
            try {
                api = getResources().getString(R.string.server_url) + "api/checklist_items/getChecklistItems.php";

                jsonParams = new JSONObject();
                String checklistId = params[0];  // params[0] is username
                jsonParams.put("checklistId", checklistId);

                ServerRequest request = new ServerRequest(api, jsonParams);
                return request.sendRequest();
            } catch(JSONException je) {
                return Excpetion2JSON.getJSON(je);
            }
        }  //end of doInBackground

        @Override
        protected void onPostExecute(JSONObject response) {
            super.onPostExecute(response);
            Log.e("ServerResponse", response.toString());
            try {
                int result = response.getInt("result");
                String message = response.getString("message");
                if (result == 1) {
                    Toast.makeText(CheckListActivity.this, message, Toast.LENGTH_LONG).show();
                    //code after getting profile details goes here
                    checkListsItemArray = response.getJSONArray("checklistItems");

                    for (int i = 0; i < checkListsItemArray.length(); i++) {

                        int pendingTasks = 0,completedTasks = 0;

                        itemList = new ArrayList<>();

                        CheckListItem checkListItem = new CheckListItem();

                        JSONObject subObject = checkListsItemArray.getJSONObject(i);
                        String checkListItemName = subObject.getString("text");//name of the attribute in response

                        checkListItem.setTitle(checkListItemName);
                        checkListItem.setBudget(checkListItemBudget);

                        itemList.add(checkListItem);//adding string to arraylist
                    }

                    CheckList checkList = new CheckList();

                    for(int i = 0; i <= iterationCount; i++ ) {

                        String checkListId = checkListArrayList.get(iterationCount).getCheckListId();

                        checkListArrayList.get(iterationCount).setCheckListItemArrayList(itemList);
                    }

                    mAdapter.notifyDataSetChanged();

                }
                else {

                    //code after failed getting profile details goes here
                }
            } catch(JSONException je) {
            }
        } //end of onPostExecute
    }



    public class GetCheckListAsyncTask extends AsyncTask<String, Void, JSONObject> {

        private String api;
        private JSONObject jsonParams;
        public GetCheckListAsyncTask(){}

        @Override
        protected JSONObject doInBackground(String... params) {
            try {
                api = getResources().getString(R.string.server_url) + "api/checklist/getChecklists.php";

                jsonParams = new JSONObject();
                String eventId = params[0];  // params[0] is username
                jsonParams.put("eventId", eventId);

                ServerRequest request = new ServerRequest(api, jsonParams);
                return request.sendRequest();
            } catch(JSONException je) {
                return Excpetion2JSON.getJSON(je);
            }
        }  //end of doInBackground

        @Override
        protected void onPostExecute(JSONObject response) {
            super.onPostExecute(response);
            //Log.e("ServerResponse", response.toString());
            try {
                int result = response.getInt("result");
                String message = response.getString("message");
                if (result == 1 ) {
                    Toast.makeText(CheckListActivity.this, message, Toast.LENGTH_LONG).show();
                    //code after getting profile details goes here

                    checkListArray = response.getJSONArray("checklists");

                    for (int i = 0; i < checkListArray.length(); i++) {
                        CheckList checkList = new CheckList();
                        JSONObject subObject = checkListArray.getJSONObject(i);
                        String checkListName = subObject.getString("checklist");//name of the attribute in response

                        checkList.setCheckListTitle(checkListName);
                        checkList.setBudget(checkListBudget);

                        checkListArrayList.add(checkList);

                         if(checkListArrayList.size() > iterationCount) {

                            String checkListId1 = checkListArrayList.get(iterationCount).getCheckListId();
                            new GetCheckListsItemAsyncTask().execute(checkListId1);

                            iterationCount ++;
                        }

                        mAdapter.notifyDataSetChanged();

                    }
                else {
                    Toast.makeText(CheckListActivity.this, message, Toast.LENGTH_LONG).show();
                    //code after failed getting profile details goes here
                    if ((progressDialog != null) && progressDialog.isShowing()) {
                        progressDialog.dismiss();
                    }
                }
            } catch(JSONException je) {
            }
        } //end of onPostExecute

    }
}

为了获得checkListArrayList 的位置,我创建了一个迭代计数变量,并在GeckCheckListAsyncTaskpostExecute 方法中增加了它。并尝试在GetCheckListItemsAsyncTask 中访问它并在checkList 的对象中设置arraylist。

但是如果 GetCheckListItemAsyncTask 的 for 循环,它会抛出索引越界异常。我应该如何获取checkListArray 的索引以将CheckListItemArray 设置为checkListArrayList 的相同位置?

日志:

Process: com.example.siddhi.meavita, PID: 20503
    java.lang.IndexOutOfBoundsException: Invalid index 5, size is 5
    at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:255)
    at java.util.ArrayList.get(ArrayList.java:308)
    at com.example.siddhi.meavita.Activities.CheckListActivity$GetCheckListsItemAsyncTask.onPostExecute(CheckListActivity.java:336)
    at com.example.siddhi.meavita.Activities.CheckListActivity$GetCheckListsItemAsyncTask.onPostExecute(CheckListActivity.java:261)

【问题讨论】:

  • 请贴出错误日志
  • 添加了日志。请帮忙..谢谢..@Shank
  • 336261 是哪些行
  • GetCheckListItemsAsyncTask 的 for 循环中的两行。 @Shank
  • 我知道,在这里发布确切的行

标签: android arraylist android-asynctask position indexoutofboundsexception


【解决方案1】:

改为:

for(int i = 0; i < iterationCount; i++ ) {

    String checkListId = checkListArrayList.get(i).getCheckListId();
    checkListArrayList.get(i).setCheckListItemArrayList(itemList);
}

您正在将 i0 迭代到 iterationCount。但是,在循环内部,您始终使用 iterationCount 而不是 i

【讨论】:

  • 是的.. 谢谢它解决了异常.. 但我只为每个 checkList 获取最后生成的 itemList。你能帮忙吗? @Guilherme P
【解决方案2】:

你应该改变

for(int i = 0; i <= iterationCount; i++ ) {

到这里

for(int i = 0; i < iterationCount; i++ ) {

数组中只有五个项目而不是六个,这就是您崩溃的原因。

【讨论】:

  • 试过这个,我还是得到了例外。 @apmartin1991
  • GetCheckListItemsAsyncTask 的 for 循环中的两行。 @apmartin1991
  • String checkListId = checkListArrayList.get(iterationCount).getCheckListId(); checkListArrayList.get(iterationCount).setCheckListItemArrayList(itemList); @apmartin1991
猜你喜欢
  • 2014-09-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多