[開發] 小心,AsyncTask 不是萬能的

看板Android (安卓)作者 (after 60)時間14年前 (2010/09/14 12:23), 編輯推噓12(1204)
留言16則, 15人參與, 最新討論串1/1
[原文] ysl 的程式天堂 http://ysl-paradise.blogspot.com/2010/09/asynctask.html Don't only use AsyncTask for your download task 要進入 Android 應用開發之門,真的一點都不難,不就是 Java 嘛。這是我最常聽到, 剛跨過入門檻開發者告訴我的一句話。 這句話其實是沒有錯的,Android 應用開發的入門檻,比起其他平台,已經低了許多。要 跨過這門檻,的確是輕鬆容易許多。不過,如果要從入門到進階,邁向下一個關卡,你第 一個要了解的是 Activity 的生命週期 和 Process 的生命週期,而且是要『透 . 徹 . 了 . 解』。這一步很重要,卻被許多開發者輕忽了。 尤其這 Activity 的生命週期,實際上的行為會比你從文件上看到的說明還來的複雜。也 因此,我發現有不少,即使已有多個 Android 應用開發經驗的開發者,在開發 Android 應用時,還是栽了不少跟斗。這第一個問題,就出在這些開發者,還是沒達到我說的『透 徹了解』境界。因此,今年的進階應用開發課程,特地將這一部分加入進來,希望對想踏 入進階之門的開發者,有所助益。 好了,如果你已經有一段 Android 應用的開發經驗,那應該知道在 Main-thread(UI-thread) 中,你不能執行一件需時 5 秒以上的工作,例如網路或資料 庫的存取、音樂的播放等等。要不然你的應用就會產生 ANR 錯誤。要解決這個 ANR 錯誤 ,唯一的方法就是自行建立一個新的 Thread 物件,並將該費時的工作放在 Thread.run() 中執行。關於如何解決 ANR 的細節,我建議你先讀 Painless threading ,這是一篇值得一讀的好文章。 Painless threading http://android-developers.blogspot.com/2009/05/painless-threading.html 在這篇文章中,介紹了從 Android 1.5 才加入的 AsyncTask。AsyncTask 很好用,同時 我也建議你研究他的 原始碼。AsyncTask 就是太好用了,有些開發者就認為,單用 AsyncTask 就能解決他的問題。其實,我早在請將要執行很久的程式碼,放在 Service 中執行這篇中,就已提過。單將費時的程式碼放在 Thread.run() 中執行,還是不夠的, 請將要執行很久的程式碼,放在 Service 中執行 http://ysl-paradise.blogspot.com/2009/01/service.html 你只解決一半的問題。不過,多數開發者不是便宜行事,就是不相信我說的。這些便宜行 事的開發者,就是在賭這系統強制殺掉你應用的機率有多少;而那些不相信我說的,就是 因為他沒有透徹了解 Activity/Process 的生命週期。 完整解決費時工作的方法,不僅要將費時的工作放在 Thread.run() 中執行,還要將這個 Thread 放在 Service 中執行。 你要知道 Android 的四大元件,Activity, BroadcastReceiver, Servcice and ContentProvider,除了 ContentProvide 外,全都是在 main-thread 中執行。而這些元 件中,就只有 Service 的生命週期是最持續(長久)的。Activity 只要執行到 onPause() ,BroadcastReceiver 只要離開 onReceiver(),系統隨時會殺掉這些元件,而且機率還 很高。Service 當然也是會被系統砍掉,只不過它的優先順序,排在較低等級。自然被系 統砍掉的機率就低很多。你還可以更進一步利用 Serivce.startForeground() 降低你被 系統殺掉的優先順序。關於這部分,你要熟讀 Process 的生命週期 與 What is a Service?。 其實為了減輕開發者的負擔, Android 1.5 已經加了 IntentService 這個新類別。如果 你要寫個用到網路的應用,用這個 IntentService 才是你的完美解決方案。 要使用這個 IntentService 其實很簡單,你只要繼承這個 IntentService 並將該項費時 的工作,移到 onHandleIntent() 中即可。onHandleIntent() 是被 non-UI thread 所喚 起的。因此在這裏面你可以放心地去執行你的下載工作。 下次,我們來研究一下這個 IntentService 的原始碼,看他是如何做的。 -- -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.113.148.73

09/14 12:33, , 1F
不要拖稿!!! 我要看IntentService怎麼運作
09/14 12:33, 1F

09/14 12:33, , 2F
感謝大大的分享
09/14 12:33, 2F

09/14 12:38, , 3F
去跟ysl前輩催稿阿 XD
09/14 12:38, 3F

09/14 12:48, , 4F
謝謝大大分享
09/14 12:48, 4F

09/14 12:52, , 5F
推好文!
09/14 12:52, 5F

09/14 13:01, , 6F
推好文 敲碗別拖稿XD
09/14 13:01, 6F

09/14 13:18, , 7F
推專業
09/14 13:18, 7F

09/14 14:15, , 8F
千萬別富堅哪!!
09/14 14:15, 8F

09/14 15:30, , 9F
09/14 15:30, 9F

09/14 19:03, , 10F
純推不下!眼花花!!
09/14 19:03, 10F

09/14 19:29, , 11F
09/14 19:29, 11F

09/14 19:55, , 12F
好文......沒推了 囧
09/14 19:55, 12F

09/14 20:37, , 13F
推!
09/14 20:37, 13F

09/15 19:51, , 14F
好文m
09/15 19:51, 14F

09/16 23:58, , 15F
好文...給推...雖然我還沒正式跳下去寫 Java >口<
09/16 23:58, 15F

09/22 12:41, , 16F
好文 推
09/22 12:41, 16F
文章代碼(AID): #1CZlZS3V (Android)
文章代碼(AID): #1CZlZS3V (Android)