[問題] Asynctask 無法立即執行的問題(已解決)

看板AndroidDev作者 (WIND)時間11年前 (2014/04/17 20:38), 11年前編輯推噓3(3012)
留言15則, 4人參與, 最新討論串1/2 (看更多)
  最近寫了一個程式,功能會大量用到 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
但ap都crash了.. Asynctask 還會有影響?這麼神奇QQ
04/17 21:26, 1F
我也覺得很神奇,寫 Android 兩年有餘,這種事情還真的頭次遇到。 ※ 編輯: jastpower884 (111.248.232.9), 04/17/2014 21:41:58

04/17 21:56, , 2F
用executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR)
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
我覺得你的Asynctask 裡面的連線,要設定timeout
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
asynctask 先跟系統預設的Thread Poor分開來
04/17 22:06, 7F

04/17 22:07, , 8F
當時會造成這樣的原因是因為 兩個thread 互相等待
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
pool?
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
要間容3.0以前的,會有點麻煩
04/22 12:21, 12F

04/22 12:22, , 13F
可以考慮直接使用一個3.0以後的asynctask(從源碼抓)
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
bitmap oom 我之前也是很常遇到阿~~~~ (爆
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
文章代碼(AID): #1JJyjLVl (AndroidDev)
文章代碼(AID): #1JJyjLVl (AndroidDev)