Android 异常:ConcurentModificationException [英] Android Exception : ConcurentModificationException

查看:43
本文介绍了Android 异常:ConcurentModificationException的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

当列表视图从我们选择的项目的详细信息加载到背面时,我遇到了不一致的异常.

I am getting this exception inconsistently while listview loading on back press from details of the item, which we selected.

当我进入这个列表视图页面时,它永远不会抛出异常,但是当我进入这个列表视图项目并删除/更新列表视图时.

when I am going on this listview page it never throws exception but When I will go into this listview item and delete/Update listview.

这是我的代码.

if (result != null) {
    try {
        ListParser listParser = new ListParser(context);
        JSONObject jsonParseData = new JSONObject(result);
        JSONObject listJson = new JSONObject(jsonParseData.getString("GetAllResult"));

        if (listJson.getBoolean(getResources().getString(R.string.success))) {

            **listParser.getListData(listJson);** // parser class parses data into ARRAYLIST

            String[] ITEMS = new String[ListParser.listData.size()];

            for (int i = 0; i < ITEMS.length; i++) {
                ITEMS[i] = ListParser.listData.get(i).getName().toString();
                mItemsID.add(ListParser.listData.get(i).getNameId().toString());
            }

            // Array to ArrayList
            mItems = new ArrayList<String>(Arrays.asList(ITEMS));
            mListSectionPos = new ArrayList<Integer>();
            mListItems = new ArrayList<String>();

            **synchronized (ListParser.listData) {
                new Poplulate().execute(ListParser.listData);  
                // parser class uses data from ARRAYLIST... I think exception is throwing from here.
            }**

        } else {
            CommonUtil.showValidationAlert(context, listJson.getString(getResources().getString(R.string.error)));
            Log.i(TAG, " " + listJson.getString(getResources().getString(R.string.error)));
        }
    } catch (JSONException e) {
        e.printStackTrace();
    }
} else {
    ToastUtil.ToastShort(context, "Server Timed out");
}

填充 AsyncTask 代码来自此处:

private class Poplulate extends AsyncTask<ArrayList<listModel>, Void, Void> {

    ...

    @Override
    protected void onPreExecute() {
        // show loading indicator
        showLoading(mListView, mLoadingView, mEmptyView);
        super.onPreExecute();
    }

    @Override
    protected Void doInBackground(ArrayList<listModel>... params) {
        mListItems.clear();
        mListSectionPos.clear();
        ArrayList<listModel> items = params[0];
        if (mItems.size() > 0) {

            // NOT forget to sort array
            Collections.sort(ListParser.listData, new CustomComparator());

            String prev_section = "";

            synchronized (this) {
                for (listModel current_item : items) {
                    String current_section = current_item.getName().substring(0, 1).toUpperCase(Locale.getDefault());

                    if (!prev_section.equals(current_section)) {
                        mListItems.add(current_section);
                        mListItems.add(current_item.getName());
                        // array list of section positions
                        mListSectionPos.add(mListItems.indexOf(current_section));
                        prev_section = current_section;
                    } else {
                        mListItems.add(current_item.getName());
                    }
                }
            }
        }
        return null;
    }

    @Override
    protected void onPostExecute(Void result) {
        if (!isCancelled()) {
            if (mListItems.size() <= 0) {
                showEmptyText(mListView, mLoadingView, mEmptyView);
            } else {
                setListAdaptor();
                showContent(mListView, mLoadingView, mEmptyView);
            }
        }
        super.onPostExecute(result);
    }
}

这是堆栈跟踪行

03-24 18:23:24.681: E/AndroidRuntime(6841): FATAL EXCEPTION: AsyncTask #1
03-24 18:23:24.681: E/AndroidRuntime(6841): Process: com.smart.adlware, PID: 6841
03-24 18:23:24.681: E/AndroidRuntime(6841): java.lang.RuntimeException: An error occured while executing doInBackground()
03-24 18:23:24.681: E/AndroidRuntime(6841):     at android.os.AsyncTask$3.done(AsyncTask.java:300)
03-24 18:23:24.681: E/AndroidRuntime(6841):     at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355)
03-24 18:23:24.681: E/AndroidRuntime(6841):     at java.util.concurrent.FutureTask.setException(FutureTask.java:222)
03-24 18:23:24.681: E/AndroidRuntime(6841):     at java.util.concurrent.FutureTask.run(FutureTask.java:242)
03-24 18:23:24.681: E/AndroidRuntime(6841):     at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
03-24 18:23:24.681: E/AndroidRuntime(6841):     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
03-24 18:23:24.681: E/AndroidRuntime(6841):     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
03-24 18:23:24.681: E/AndroidRuntime(6841):     at java.lang.Thread.run(Thread.java:841)
03-24 18:23:24.681: E/AndroidRuntime(6841): Caused by: java.util.ConcurrentModificationException
03-24 18:23:24.681: E/AndroidRuntime(6841):     at java.util.ArrayList$ArrayListIterator.next(ArrayList.java:573)
03-24 18:23:24.681: E/AndroidRuntime(6841):     at com.smart.adlware.CaregiverList$Populate.doInBackground(CaregiverList.java:324)
03-24 18:23:24.681: E/AndroidRuntime(6841):     at com.smart.adlware.CaregiverList$Populate.doInBackground(CaregiverList.java:1)
03-24 18:23:24.681: E/AndroidRuntime(6841):     at android.os.AsyncTask$2.call(AsyncTask.java:288)
03-24 18:23:24.681: E/AndroidRuntime(6841):     at java.util.concurrent.FutureTask.run(FutureTask.java:237)
03-24 18:23:24.681: E/AndroidRuntime(6841):     ... 4 more

所以请尽快帮助我.我被这个异常困住了.

So please assist me ASAP. I am stuck with this Exception.

推荐答案

synchronized (this) {
            for (listModel current_item : items) {
                String current_section = current_item.getName().substring(0, 1).toUpperCase(Locale.getDefault());

                if (!prev_section.equals(current_section)) {
                    mListItems.add(current_section);
                    mListItems.add(current_item.getName());
                    // array list of section positions
                    mListSectionPos.add(mListItems.indexOf(current_section));
                    prev_section = current_section;
                } else {
                    mListItems.add(current_item.getName());
                }
            }
        }

问题同步(这个).由于你没有提供stacktrace,不知道是哪个操作抛出的异常.

例如,如果您的异常是由多线程访问 items 引起的,您可以将 this 替换为 items.

For example , if your exception is caused by multi-thread access to items , you can just replace this with items.

这篇关于Android 异常:ConcurentModificationException的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆