Android 板


LINE

[原文] 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
1F:推 cjoe:不要拖稿!!! 我要看IntentService怎麼運作 09/14 12:33
2F:→ cjoe:感謝大大的分享 09/14 12:33
3F:→ Jotarun:去跟ysl前輩催稿阿 XD 09/14 12:38
4F:→ meya:謝謝大大分享 09/14 12:48
5F:推 terrybob:推好文! 09/14 12:52
6F:推 ericinttu:推好文 敲碗別拖稿XD 09/14 13:01
7F:推 abccbaandy:推專業 09/14 13:18
8F:推 wyvernlee:千萬別富堅哪!! 09/14 14:15
9F:推 jazzhuang:推 09/14 15:30
10F:推 chris:純推不下!眼花花!! 09/14 19:03
11F:推 BGrap:讚 09/14 19:29
12F:→ coronach:好文......沒推了 囧 09/14 19:55
13F:推 TKforce:推! 09/14 20:37
14F:推 jc1989824:好文m 09/15 19:51
15F:推 madoka82:好文...給推...雖然我還沒正式跳下去寫 Java >口< 09/16 23:58
16F:推 milochen:好文 推 09/22 12:41







like.gif 您可能會有興趣的文章
icon.png[問題/行為] 貓晚上進房間會不會有憋尿問題
icon.pngRe: [閒聊] 選了錯誤的女孩成為魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一張
icon.png[心得] EMS高領長版毛衣.墨小樓MC1002
icon.png[分享] 丹龍隔熱紙GE55+33+22
icon.png[問題] 清洗洗衣機
icon.png[尋物] 窗台下的空間
icon.png[閒聊] 双極の女神1 木魔爵
icon.png[售車] 新竹 1997 march 1297cc 白色 四門
icon.png[討論] 能從照片感受到攝影者心情嗎
icon.png[狂賀] 賀賀賀賀 賀!島村卯月!總選舉NO.1
icon.png[難過] 羨慕白皮膚的女生
icon.png閱讀文章
icon.png[黑特]
icon.png[問題] SBK S1安裝於安全帽位置
icon.png[分享] 舊woo100絕版開箱!!
icon.pngRe: [無言] 關於小包衛生紙
icon.png[開箱] E5-2683V3 RX480Strix 快睿C1 簡單測試
icon.png[心得] 蒼の海賊龍 地獄 執行者16PT
icon.png[售車] 1999年Virage iO 1.8EXi
icon.png[心得] 挑戰33 LV10 獅子座pt solo
icon.png[閒聊] 手把手教你不被桶之新手主購教學
icon.png[分享] Civic Type R 量產版官方照無預警流出
icon.png[售車] Golf 4 2.0 銀色 自排
icon.png[出售] Graco提籃汽座(有底座)2000元誠可議
icon.png[問題] 請問補牙材質掉了還能再補嗎?(台中半年內
icon.png[問題] 44th 單曲 生寫竟然都給重複的啊啊!
icon.png[心得] 華南紅卡/icash 核卡
icon.png[問題] 拔牙矯正這樣正常嗎
icon.png[贈送] 老莫高業 初業 102年版
icon.png[情報] 三大行動支付 本季掀戰火
icon.png[寶寶] 博客來Amos水蠟筆5/1特價五折
icon.pngRe: [心得] 新鮮人一些面試分享
icon.png[心得] 蒼の海賊龍 地獄 麒麟25PT
icon.pngRe: [閒聊] (君の名は。雷慎入) 君名二創漫畫翻譯
icon.pngRe: [閒聊] OGN中場影片:失蹤人口局 (英文字幕)
icon.png[問題] 台灣大哥大4G訊號差
icon.png[出售] [全國]全新千尋侘草LED燈, 水草

請輸入看板名稱,例如:e-shopping站內搜尋

TOP