[問題] Asynctask 無法立即執行的問題(已解決)
最近寫了一個程式,功能會大量用到 Asynctask 和 GCM 去向網路取資料。
但是最近發生了一個狀況,就是在某些狀況下(可能是 Asynctask 沒把東西還沒取
完東西)如果碰到主程序 Crash 的時候,再開啟一次程式 Asynctask 的執行序會全部都
卡住。
低階機種 HTC Desire S(大樹)倒是不會有這種狀況,但是 LG G2、Sansumg Note3
卻得卡上一段時間才會跑執行序(大約一分鐘),而如果遇到 Sony 的機子(Z、ZR),則會
徹底卡死,除非去清除暫存和快取,還有強制終止程式才能解決。
碰到這樣的狀況如果我下 ActivityManager.killBackgroundProcess 能夠解決,本
來是想說用 UncaughtExceptionHandler 去攔截後下殺光所有背景服務的指令,只是好
像不是每一次都這麼順利(有的時候可以,有的時候不行)。
周遭的同仁對這個狀況多出了很有趣的假設,因為大樹的記憶體太少了,所以在程
式寫壞當掉的時候會把這些東西清掉,但是 G2 Note3 或是 ZR Z 那些,則是記憶體
比較大,會把這些卡住的執行序留著,反而讓一次限制五個執行的 AsynTask 卡住了。
我想問的是,有沒有人遇過太多異步任務卡住的問題?是如何解決呢?
--
"The speed of communication is wondrous to behold. It is also true that speed
can multiply the distribution of infomation that we know to be untrue." -
Edward R. Murrow
「現代的通訊速度確實驚人,但它同時也能加速錯誤訊息的傳播」- 愛德華‧莫羅
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 111.248.232.9
※ 文章網址: http://www.ptt.cc/bbs/AndroidDev/M.1397738325.A.7EF.html
→
04/17 21:26, , 1F
04/17 21:26, 1F
我也覺得很神奇,寫 Android 兩年有餘,這種事情還真的頭次遇到。
※ 編輯: jastpower884 (111.248.232.9), 04/17/2014 21:41:58
推
04/17 21:56, , 2F
04/17 21:56, 2F
→
04/17 21:57, , 3F
04/17 21:57, 3F
→
04/17 21:57, , 4F
04/17 21:57, 4F
恩,謝謝,我會試試。其實我比較怕的是,這不單是 Asynctask 的問題,會不會是我用
了一些 static 的關係....。
→
04/17 21:58, , 5F
04/17 21:58, 5F
其實有設 timeout 的,但是如果 crash 掉,已經 timeout 還是卡著,我是覺得他就會卡
著直到被系統拋掉了。
※ 編輯: jastpower884 (111.248.232.9), 04/17/2014 22:03:42
→
04/17 22:05, , 6F
04/17 22:05, 6F
→
04/17 22:06, , 7F
04/17 22:06, 7F
→
04/17 22:07, , 8F
04/17 22:07, 8F
→
04/17 22:07, , 9F
04/17 22:07, 9F
喔喔喔,這樣啊,我還以為只有我有這種狀況,趕緊來試試。x
※ 編輯: jastpower884 (111.248.232.9), 04/17/2014 22:13:08
恩姆,真的是 Thread 阻塞的問題,用Thread pool 就解決了,根據廠商,阻塞的表現
還會有所不同...。
※ 編輯: jastpower884 (111.248.220.197), 04/19/2014 11:45:01
推
04/19 16:58, , 10F
04/19 16:58, 10F
→
04/19 21:13, , 11F
04/19 21:13, 11F
恩,就是我一個 Activity 會同時使用 AsyncTask.execute() ,至少會有五個吧。
如果這時候 Crash 掉,再重開一次程式, AsyncTask.execute() 就不會立即執行,
有的手機甚至就卡在那邊永遠都不動了。
在我的認知上,是因為 3.0 後的 AsyncTask.execute() 一次只會執行一個,其他的就會
進入排隊的狀態,所以一個塞著隊伍,其他都卡住了。
後來我就改用 executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR) 就解決了。
不知道是不是這個指令會把前面的 AsyncTask 給踢掉就是了。
※ 編輯: jastpower884 (111.248.220.197), 04/21/2014 23:06:43
→
04/22 12:21, , 12F
04/22 12:21, 12F
→
04/22 12:22, , 13F
04/22 12:22, 13F
這邊我很乾脆直接繼承 AsyncTask 去寫一個 function 用 Build.VERSION.SDK_INT 做
判斷了,3.0 前直接用 execute,3.0 後就用 executeOnExecutor。
兩者寫法不同,不過實際跑起來是一樣的。其實這個問題不要讓手機 Crash 掉都不會遇
到,現在我比較頭痛的是 bitmap 的 OOM。
※ 編輯: jastpower884 (118.163.116.90), 04/22/2014 13:24:47
※ 編輯: jastpower884 (118.163.116.90), 04/22/2014 13:26:23
推
04/22 14:27, , 14F
04/22 14:27, 14F
→
04/22 14:28, , 15F
04/22 14:28, 15F
這部份比較像是我個人耍憨包,本來是 LruCache SoftReference 都用上了就是無解
感覺很絕望...後來發現是自己腦殘抓了近百張 300*300 的圖片...大樹會爆不解釋,
這樣的狀況 G2 都不見得撐得住。
※ 編輯: jastpower884 (118.163.116.90), 04/22/2014 15:32:21
討論串 (同標題文章)