小心,AsyncTask 不是萬能的 - Android

Belly avatar
By Belly
at 2010-09-14T12:23

Table of Contents

[原文] 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 的原始碼,看他是如何做的。

--

--
Tags: Android

All Comments

Joe avatar
By Joe
at 2010-09-15T20:24
不要拖稿!!! 我要看IntentService怎麼運作
感謝大大的分享
Ida avatar
By Ida
at 2010-09-19T18:56
去跟ysl前輩催稿阿 XD
Oscar avatar
By Oscar
at 2010-09-22T17:20
謝謝大大分享
Bethany avatar
By Bethany
at 2010-09-25T07:28
推好文!
Queena avatar
By Queena
at 2010-09-30T07:21
推好文 敲碗別拖稿XD
Delia avatar
By Delia
at 2010-10-04T23:35
推專業
Yuri avatar
By Yuri
at 2010-10-05T04:10
千萬別富堅哪!!
Doris avatar
By Doris
at 2010-10-09T06:28
Caroline avatar
By Caroline
at 2010-10-10T09:20
純推不下!眼花花!!
Jacky avatar
By Jacky
at 2010-10-10T20:14
Gary avatar
By Gary
at 2010-10-15T18:13
好文......沒推了 囧
Sierra Rose avatar
By Sierra Rose
at 2010-10-18T07:16
推!
Iris avatar
By Iris
at 2010-10-22T02:19
好文m
Daph Bay avatar
By Daph Bay
at 2010-10-27T01:12
好文...給推...雖然我還沒正式跳下去寫 Java >口<
Suhail Hany avatar
By Suhail Hany
at 2010-10-28T08:43
好文 推

當HTC Desire上Android 2.2 Froyo

Donna avatar
By Donna
at 2010-08-28T17:43
昨天買晚餐時在無聊等待時間中無意間看到 癮科技的文章說台灣Desire已經開放升級, 回家後立刻就給他連上WI-FI升級, 第一次升級失敗…原因:ROMandlt;25MB XD~ 大家生即時要記得把ROM清出25MB的空間! 升級時手機黑螢幕的時間還蠻少的,大部分時間都有顯示東西 如果手機黑 ...

CargoTrack 遞送狀況追蹤

Noah avatar
By Noah
at 2010-08-20T15:00
遞送狀況追蹤這個軟體可以用來追蹤目前包裹或郵件配送狀況。 輸入追蹤碼以後,軟體可以幫你到各宅配商的網站查詢貨物最新狀況, 也可以在之後依設定,主動通知警示未送達的包裹。 目前支援的宅配有: 郵局(14或20碼) 黑貓宅急便(10或12碼) 台灣宅配通(12碼) 大榮貨運(10或11碼) UPS 新竹貨運 ...

[Desire] LeeDrOiD V1.9 release

Sierra Rose avatar
By Sierra Rose
at 2010-08-15T17:41
LeeDrOiD V1.9 release 刷機有風險!請斟酌服用。 Change Log: V1.9 ●Updated Adobe Flash 10.1.92.8 更新Flash Player到正式版10.1.92.8 ●Fixed Open VPN su ...

Android遊戲修改工具 GameCIH

Madame avatar
By Madame
at 2010-08-08T01:22
Update: install GameCIH2 in Android Market 有鄉民不小心, 看到我之前Post文章, 偷偷夾帶的推文, 使用後, 還是不太會使用~ 問我... So... 我還是寫一篇使用手冊... =================== Android遊戲修改工具 ==== ...

按一下root手機:UniversalAndroot

Harry avatar
By Harry
at 2010-08-05T12:44
原文網址: http://blog.23corner.com/2010/08/04/%E5%A4%8F%E6%97%A5-android-%E5%B0%8F%E5%93% 81-%E6%8C%89%E4%B8%80%E4%B8%8B-root-%E6%89%8B%E6%A9%9F-universalandro ...