2

Я получаю ConcurrentModificationException, когда я пересекаю ArrayList. Что я сделал:Создает ли AsynckTask.onPostExecute и FragmentActivity.onResumeFragments один и тот же поток (ui thread)?

1. activity has a ArrayList<Callable> 
2. add Callable to ArrayList when AsyncTask.onPostExecute 
3. traverse the ArrayList to call the callable in onResumeFragments 

Как исключение срабатывать: я сделать кнопку AsyncTask.execute() и нажмите домой быстро, когда мое приложение вернется на передний план, исключение произошло.

Что меня смущает: если AsyncTask.onPostExecute и работать на одном потоке, не будет java.util.ConcurrentModificationException, верно?

Как я знаю AsyncTask.onPostExecute работает на поток пользовательского интерфейса, и должен работает на Ui нить тоже, так как java.util.ConcurrentModificationException СЛУЧИЛОСЬ?

Это мой стек исключение

com.yumei.sdkdemo I/PayMethodActivity: 
    11-10 11:34:35.218 10030-10030/com.yumei.sdkdemo E/AndroidRuntime: FATAL EXCEPTION: main 
Process: com.yumei.sdkdemo, PID: 10030 
java.lang.RuntimeException: Unable to resume activity {com.yumei.sdkdemo/com.yumei.sdk.PayMethodActivity}: java.util.ConcurrentModificationException 
at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2954) 
at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:2985) 
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1327) 
at android.os.Handler.dispatchMessage(Handler.java:102) 
at android.os.Looper.loop(Looper.java:135) 
at android.app.ActivityThread.main(ActivityThread.java:5235) 
at java.lang.reflect.Method.invoke(Native Method) 
at java.lang.reflect.Method.invoke(Method.java:372) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:906) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:701) 
Caused by: java.util.ConcurrentModificationException 
at java.util.ArrayList$ArrayListIterator.next(ArrayList.java:573) 
at com.yumei.sdk.PayMethodFragmentActivity.onResumeFragments(PayMethodActivity.java:116) 
at android.support.v4.app.FragmentActivity.onPostResume(FragmentActivity.java:451) 
at android.support.v7.app.AppCompatActivity.onPostResume(AppCompatActivity.java:141) 
at android.app.Activity.performResume(Activity.java:6040) 
at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2943) 
at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:2985) 
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1327) 
at android.os.Handler.dispatchMessage(Handler.java:102) 
at android.os.Looper.loop(Looper.java:135) 
at android.app.ActivityThread.main(ActivityThread.java:5235) 
at java.lang.reflect.Method.invoke(Native Method) 
at java.lang.reflect.Method.invoke(Method.java:372) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:906) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:701) 

спасибо за ваш ответ.

+0

'onPostExecute' работает в потоке, из которого вы вызываете метод' asyncTask.execute() 'от – Bhargav

+0

Можете ли вы опубликовать некоторые образцы кода, так как никто не может вам помочь, только прочитав трассировку стека. –

ответ

1

Обратите внимание, что если вы хотите удалить некоторые предметы во время прохождения, вы должны Iterator. И если ваш AsynTask не был создан в потоке пользовательского интерфейса, убедитесь, что вы используете поточно-безопасный.

1

Да, InPostexcute AsyncTask запускается в потоке пользовательского интерфейса, и я не думаю, что это проблема потоков. ConcurrentModificationException может возникнуть, если вы попробуете modify ваш Arraylist, зацикливая его элементы (например, удалите Callable со стороны for).
p/s: вы должны написать свой код onPostExcute с вашим логарифмом.