AsyncTask 多线程并发导致Fatal signal 11 (SIGSEGV)

Kevenshao 2013-12-12 11:10:38
我设置AsyncTask 线程池3个线程并发执行,去异步更新listview的图片,当快速划动listview时,导致force close,不知道如何解决,请遇到此类问题的同仁赐教。

【版本】
Android SDK4.0.3 运行在4.2.2版手机上

【AsyncTask类】
public static final Executor mExec = new ThreadPoolExecutor(3, 200, 1, TimeUnit.SECONDS, new LinkedBlockingQueue<Runnable>());

class CanvasImageTask extends AsyncTask<Object, Void, Bitmap> {
// .......网络上下载图片并设置
}


【调用】
Object obj[] = new Object[2];
obj[0] = view;
obj[1] = iconUrl;
new CanvasImageTask(true).executeOnExecutor(mExec, obj);


【Log】
D/SurfaceFlinger( 134): requestNextVsync(134)

D/DisplayEventReceiver(19287): rev(0x5c8fe428) w/ vsync, t=501324316513052, id=0, c=7997046

D/SurfaceFlinger( 134): requestNextVsync(19287)

D/InputReader( 556): AP_PROF:AppLaunch_dispatchPtr:Down:501324364

D/SurfaceFlinger( 134): requestNextVsync(134)

I/View (19287): Touch down dispatch to android.widget.ListView{41b1ecd0 VFED.VC. .F....I. 6,6-534,680 #7f0b00a0 app:id/rank_list}, event = MotionEvent { action=ACTION_DOWN, id[0]=0, x[0]=295.44177, y[0]=485.28406, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=0, eventTime=501324364, downTime=501324364, deviceId=3, source=0x1002 }

D/AbsListView(19287): Touch down: touch mode = 6,mScrollY = 2,y = 485.28406,mFirstPosition = 663,mActivePointerId = -1,mDataChanged = false,adatper size = 670,this = android.widget.ListView{41b1ecd0 VFED.VC. .F....I. 6,6-534,680 #7f0b00a0 app:id/rank_list}

D/AbsListView(19287): endFling: mScrollY = 2,mTouchMode = 6,mFirstPosition = 663

D/SurfaceFlinger( 134): postEvent(134, v/c=7997049)

D/SurfaceFlinger( 134): postEvent(19287, v/c=7997049)

D/SurfaceFlinger( 134): requestNextVsync(134)

D/SurfaceFlinger( 134): requestNextVsync(134)

D/DisplayEventReceiver(19287): rev(0x5c8fe428) w/ vsync, t=501324372516591, id=0, c=7997049

D/SurfaceFlinger( 134): requestNextVsync(19287)

E/mtk_dlmalloc_debug(19287): [DEBUG_INFO] bug detected at function do_check_inuse_chunk Line 4374

E/mtk_dlmalloc_debug(19287): [DEBUG_INFO]address 60e8bd50 function 1 action 1625865560 structure type 4 error_member 20 mstate 40157c48

E/mtk_dlmalloc_debug(19287):

E/mtk_dlmalloc_debug(19287): ======================== DUMP RUNTIME CHECKING DEBUGGER INFO ========================

E/mtk_dlmalloc_debug(19287): === Error structure Address : 0x60e8bd50

E/mtk_dlmalloc_debug(19287): === Function : dlfree(1)

E/mtk_dlmalloc_debug(19287): === Action : check top(16)

E/mtk_dlmalloc_debug(19287): === structure type : Inuse chunk(0x4)

E/mtk_dlmalloc_debug(19287): === Error member : head_current_free_bit(0x20)

E/mtk_dlmalloc_debug(19287): === GM : 0x40157c48

E/mtk_dlmalloc_debug(19287): === MSTATE : 0x40157c48

E/mtk_dlmalloc_debug(19287): ======================== ANALYZE ERROR TYPES ========================

D/SurfaceFlinger( 134): postEvent(134, v/c=7997050)

D/SurfaceFlinger( 134): postEvent(19287, v/c=7997050)

E/mtk_dlmalloc_debug(19287): [ERROR] Double Free at Chunk 60e8bd50!!!

E/libc_malloc_mtk_debug(19287): No backtrace becasue Debug15 is disable

E/mtk_dlmalloc_debug(19287): ======================== SHOW ERROR STRUCTURE ========================

E/mtk_dlmalloc_debug(19287): === ERROR structure : INUSE CHUNK

E/mtk_dlmalloc_debug(19287): === SHOW CHUNK and error member : 0x20

E/mtk_dlmalloc_debug(19287): === CHUNK address : 0x60e8bd50

E/mtk_dlmalloc_debug(19287): === CHUNK prev_foot : 0x3975a5f1

E/mtk_dlmalloc_debug(19287): === CHUNK size : 896

E/mtk_dlmalloc_debug(19287): === CHUNK MMAPED bit: 0x0

E/mtk_dlmalloc_debug(19287): === CHUNK PRE_CHUNK IN USE: 0x1

E/mtk_dlmalloc_debug(19287): === CHUNK CURRENT CHUNK_IN USE: 0x0

E/mtk_dlmalloc_debug(19287): ^^^^^^^^ wrong current in use bit:

E/mtk_dlmalloc_debug(19287): === CHUNK fencepost bit is : 0x1 (last three bit)

E/mtk_dlmalloc_debug(19287): ======================== SHOW ERROR STRUCTURE END ========================

E/mtk_dlmalloc_debug(19287): ======================== START TO DO CHUNK OVERFLOW DETECTION ========================

E/mtk_dlmalloc_debug(19287): ======================== CHUNK OVERFLOW DETECTION DONE ========================

E/mtk_dlmalloc_debug(19287): ======================== START TO SCAN smallbin, treebin and ALL CHUNKS ========================

E/mtk_dlmalloc_debug(19287): ======================== CHECK ALL CHUNKS DONE ======================

E/mtk_dlmalloc_debug(19287): [DEBUG_INFO] CALL ABORT FUNCTION

F/libc (19287): Fatal signal 11 (SIGSEGV) at 0xdeadbaad (code=1), thread 19395 (pool-1-thread-1)

F/libc (19287): Send stop signal to pid:19287 in debugger_signal_handler

D/AEE/AED ( 126): $===AEE===AEE===AEE===$

D/AEE/AED ( 126): p 0 poll events 1 revents 0

D/AEE/AED ( 126): not know revents:0

D/AEE/AED ( 126): p 1 poll events 1 revents 0

D/AEE/AED ( 126): not know revents:0

D/AEE/AED ( 126): p 2 poll events 1 revents 1

D/AEE/AED ( 126): aed_main_fork_worker: generator 0x3a4168, worker 0xbea7f9f8, recv_fd 15

D/PowerManagerService( 556): userActivityFromNative

D/PowerManagerService( 556): userActivityNoUpdateLocked: eventTime=501324423, event=2, flags=0x0, uid=1000

D/PowerManagerNotifier( 556): onUserActivity: event=2, uid=1000

D/PowerManagerService( 556): updateUserActivitySummaryLocked: mWakefulness=Awake, mUserActivitySummary=0x1, nextTimeout=501377423 (in 52999 ms)

D/PowerManagerService( 556): newScreenState = 2

D/PowerManagerDisplayController( 556): requestPowerState: screenState=2, useProximitySensor=false, forceProximitySensorEnable=false, screenBrightness=65, screenAutoBrightnessAdjustment=0.0, useAutoBrightness=false, useEcoBrightness=false, blockScreenOn=false, waitForNegativeProximity=false

I/PowerManagerService( 556): setBrightness mButtonLight 0.

D/PowerManagerService( 556): updateScreenStateLocked: mDisplayReady=true, newScreenState=2, mWakefulness=1, mWakeLockSummary=0x0, mUserActivitySummary=0x1, mBootCompleted=true

D/AEE/AED ( 126): p 3 poll events 1 revents 0

D/AEE/AED ( 126): not know revents:0

D/AEE/AED ( 126): p 4 poll events 1 revents 0

D/AEE/AED ( 126): not know revents:0

I/DEBUG (19546): handle_request(15)
...全文
823 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
D_Why 2014-12-22
  • 打赏
  • 举报
回复
引用 6 楼 Kevenshao 的回复:
问题解决,并非线程池原因,而是代码其它部分造成线程死锁
解决好歹说下具体是哪出问题了啊分享下啊
Kevenshao 2013-12-26
  • 打赏
  • 举报
回复
问题解决,并非线程池原因,而是代码其它部分造成线程死锁
Kevenshao 2013-12-14
  • 打赏
  • 举报
回复
UP 自己顶下吧
Kevenshao 2013-12-12
  • 打赏
  • 举报
回复
引用 1 楼 birdsaction 的回复:
Executor mExec = new ThreadPoolExecutor 这个传入到 CanvasImageTask 是做什么用的, 这个多个线程异步更新图片 不需要线程池的, 实例化2,3个线程,分批更新图片就OK 了。
android 3.0以后,AsyncTask是单线程执行的,也就是线程池只有一个线程在跑,其它的任务就会等待, Executor mExec = new ThreadPoolExecutor的目的就是设置线程池有多个线程并发执行。 选择使用AsyncTask,是因为它有线程池,不用频繁的创建销毁线程,效率更高。
Birds2018 2013-12-12
  • 打赏
  • 举报
回复
Executor mExec = new ThreadPoolExecutor 这个传入到 CanvasImageTask 是做什么用的, 这个多个线程异步更新图片 不需要线程池的, 实例化2,3个线程,分批更新图片就OK 了。
Birds2018 2013-12-12
  • 打赏
  • 举报
回复
这个到没注意到,我自己以前更新ListView都是直接开 2到3个线程 分批加载图片, 个人认为也不需要开很多线程,如果你的ListView有N多个Item需要下载图片,很可能导致内存消耗过多。 有线程池的话,也不能立即利用上,比如网络堵塞的时候 很多线程就无法及时执行完。

80,349

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧