AsynckTask.onPostExecute和FragmentActivity.onResumeFragments是否在同一个线程(ui线程)上运行?

AsynckTask.onPostExecute和FragmentActivity.onResumeFragments是否在同一个线程(ui线程)上运行?

问题描述:

当我遍历ArrayList时,得到ConcurrentModificationException。 我做了什么:AsynckTask.onPostExecute和FragmentActivity.onResumeFragments是否在同一个线程(ui线程)上运行?

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(),按home键,当我的应用程序回到前台,异常发生。

什么让我困惑的是:如果 和AsyncTask.onPostExecute运行在同一个线程, 不会有一个java.util.ConcurrentModificationException,对不对?

据我所知AsyncTask.onPostExecute在UI线程运行,并应该在UI线程运行过,所以 怎么java.util.ConcurrentModificationException happend?

这是我的异常堆栈

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

您可以发布一些代码示例,因为没有人可以通过只读栈跟踪来帮助您。 –

请注意,如果你想在遍历时删除一些项目,你应该使用迭代器。如果您的AsynTask没有在UI线程上创建,请确保您使用线程安全。

是的,AsyncTask的onPostexcute在UI线程中运行,我不认为它是线程问题。 ConcurrentModificationException可能会在您尝试modifyArraylist同时循环其元素时发生(例如,在for回路中删除Callable)。
p/s:您应该将您的onPostExcute代码与您的logcat一起发布。