在AsyncTask

时间:2016-07-05 19:34:33

标签: android arraylist android-asynctask position indexoutofboundsexception

我有一类CheckList。它有checkListIdtitleCheckListItemArrayList

我有2个asyncTasks。一个GetCheckLists另一个用于GetCheckListItems。在CheckList课程中,它有checkListId的{​​{1}},TitlearrayList

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

checkListItems的{​​{1}}方法我想将onPostExecute设置为GetCheckListItemsAsyncTask的对象。

CheckListActivity:

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 } } 的{​​{1}}方法中将其递增。并尝试在checkListArrayList中访问它并在arList的对象中设置arraylist。

但如果for GeckCheckListAsyncTask的循环,它会使索引超出绑定异常。如何获取postExecute索引以将GetCheckListItemsAsyncTask设置为GetCheckListItemAsyncTask的相同位置?

记录:

checkListArray

2 个答案:

答案 0 :(得分:1)

更改为:

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

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

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

答案 1 :(得分:0)

你应该改变

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

到这个

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

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