Nn tng Android là mt nn tng phát trin di ng mã ngu n m . Nó giúp bn truy cp vào tt c các khía cnh ca thit b di ng mà nó chy trên ó, t các ha cp thp, n phn cng nh là thit b camera trên in thoi. V i rt nhiu th có th s dng Android, có th bn s t hi ti sao bn cn phin n XML. ó không phi vì làm vic v i XML rt thú v; mà là nó ang làm vic v i nhng th mà nó kích hot. XML thng c dùng nh là mt nh dng d liu trên Internet. Nu bn mu%n truy cp d liu t Internet, các kh nng có th là d liu s dng XML. Nu bn mu%n gi d liu n mt dch v Web, có th bn c(ng cn gi c d liu XML. Nói ng)n gn là nu ng dng Android ca bn thúc y Internet, thì có th bn s cn phi làm vic v i XML. Tht may m)n là bn có rt nhiu la chn có s+n làm vic v i XML trên Android.
Trang 1
Làm vi c v i XML trên Android
M c : Trung bình
Michael Galpin, Ki n trúc s ph n m m, Ludi Labs
08 01 2010
Android là m t h i u hành ngu n m , hi n i và là SDK cho các thi t b di ng V i h i u hành
này, b n có th t o ra các ng d ng di ng r t m nh i u này th m chí còn tr nên h p d n h n n a
khi các ng d ng c a b n có th truy c p các d ch v Web, có ngh a là b n c n s d ng ngôn ng c a
Web là: XML Trong bài vi t này, b n s th y nhi u l a ch n khác nhau làm vi c v i XML trên
Android và cách s d ng chúng xây d ng các ng d ng Android c a chính b n
B t u
Trong bài vi t này, b n h c cách xây d ng các ng d ng Android có th làm vi c v i XML t Internet Các ng d ng Android c vi t b ng ngôn ng l p trình Java™, do v y mà kinh nghi m làm vi c v i công ngh Java là i u c n
ph i có phát tri n cho Android, b n s c n n Android SDK Toàn b mã trình c trình bày trong bài vi t này
s làm vi c v i b t k phiên b n nào c a Android SDK, nh ng phiên b n SDK 1.5_pre ã c s d ng phát tri n
mã trình B n có th phát tri n các ng d ng Android ch! v i SDK và m t trình biên t p v"n b n là , nh ng s d# dàng h n nhi u n u s d ng Android Developer Tools (ADT), là m t trình b$ sung Eclipse %i v i bài vi t này, phiên b n 0.9 c a ADT ã c dùng v i Eclipse 3.4.2, m t phiên b n Java Xem Tài nguyên l y các liên k t d n
n t t c các c ng c này
XML trên Android
N n t ng Android là m t n n t ng phát tri n di ng mã ngu n m Nó giúp b n truy c p vào t t c các khía c nh c a thi t b di ng mà nó ch y trên ó, t các h a c p th p, n ph n c ng nh là thi t b camera trên i n tho i V i
r t nhi u th có th s d ng Android, có th b n s t h&i t i sao b n c n phi n n XML ó không ph i vì làm vi c
v i XML r t thú v ; mà là nó ang làm vi c v i nh ng th mà nó kích ho t XML th 'ng c dùng nh là m t nh
d ng d li u trên Internet N u b n mu%n truy c p d li u t Internet, các kh n"ng có th là d li u s d ng XML
N u b n mu%n g i d li u n m t d ch v Web, có th b n c(ng c n g i c d li u XML Nói ng)n g n là n u ng
d ng Android c a b n thúc *y Internet, thì có th b n s c n ph i làm vi c v i XML Th t may m)n là b n có r t nhi u l a ch n có s+n làm vi c v i XML trên Android
Các trình phân tích XML
M t trong nh n u i m l n nh t c a n n t ng Android chính là vi c nó
thúc *y ngôn ng l p trình Java Android SDK không hoàn toàn cung c p
s+n m i th cho Môi tr 'ng Th'i gian ch y Java (JRE) chu*n c a b n,
nh ng nó l i h, tr m t ph n r t áng k cho nó N n t ng Java ã và ang
h, tr r t nhi u cách khác nhau làm vi c v i XML trong th'i gian nh t
nh, và h u h t các API có liên quan n XML c a Java u c h, tr
y trên Android Ví d , Simple API c a Java cho XML (SAX) và
Document Object Model (DOM) hi n u có s+n trên Android Nhi u n"m
qua, c hai API này là m t ph n c a công ngh Java S n ph*m Streaming
API m i ây cho XML (StAX) hi n ch a có trong Android Tuy nhiên,
Android l i cung c p m t th vi n t ng ng v m-t ch c n"ng i u
Các t vi t t t thông d ng
API: Application programming interface (Giao
di n l p trình ng d ng) RSS: Really Simple Syndication (Giao th c t p
h p thông tin n gi n) SDK: Software Developers Kit (B d ng c cho nhà phát tri n ph m m m)
Trang 2cu%i cùng là Java XML Binding API c(ng không có s+n trong Android
Ch)c ch)n có th th c hi n API này trong Android Tuy nhiên, nó l i có xu
h ng là m t API n-ng ký, v i r t nhi u th hi n khác nhau thu c các l p
khác nhau th 'ng c n vi c trình bày m t tài li u XML Do v y mà nó không
lý t ng l)m cho m t môi tr 'ng b ràng bu c ch.ng h n nh thi t b c m
tay mà Android c thi t k ch y trên ó Trong các ph n ti p theo, b n
s l y m t ngu n XML n gi n có s+n trên Internet, và xem cách phân tích
ngu n ó nh th nào trong ph m vi m t ng d ng Android s d ng các
API khác nhau c nh)c n trên.Tr c tiên, hãy xem các ph n c n thi t c a ng d ng n gi n s s d ng XML
t Internet
Trình c tin Android
/ng d ng s l y i m tin RSS t trang nhà phát tri n Android ph$ bi n Androidster và phân tách nó thành m t danh sách các %i t ng Java n gi n mà b n có th s d ng quay l i Android ListView (xem T i v l y mã ngu n)
ây là ho t ng a hình thái c$ i n — t c là các th c thi khác nhau (các thu t toán phân tích XML khác nhau) cung
c p ho t ng gi%ng nhau Ví d 1 cho b n th y b n có th mô hình hóa i u này d# dàng nh th nào trong mã trình Java s d ng m t giao di n
Ví d 1 giao di n trình phân tích i m tin XML
Trong Ví d 2, l p Message là m t POJO (Plain Old Java Object) c$ i n miêu t m t c u trúc d li u
Ví d 2 Message POJO
UI: User interface (Giao di n
ng 'i dùng) URL: Universal Resource Locator ( a ch! tài nguyên) XML: Extensible Markup Language (Ngôn ng ánh
d u m r ng)
!
"
#
$ 2'
$
%
.
"
"
"
9+ ,8,
"
.
"
"
:&
Trang 3Message, trong Ví d 2, th 'ng r t d# làm Nó *n i m t vài tr ng thái bên trong c a mình b ng cách cho phép truy
c p ngày tháng và các liên k t nh các chu,i n gi n, trong khi th hi n chúng nh các %i t ng c s)p x p m t cách rõ ràng (m t java.util.Date và m t java.net.URL) Nó là m t Value Object ( %i t ng Giá tr ) c$ i n, do
v y nó th c thi equals() và hashCode() d a trên tr ng thái bên trong c a nó Nó c(ng th c hi n giao di n
Comparable vì th b n có th s d ng nó s)p x p (theo ngày tháng) Th c t , d li u c phân lo i t i m tin,
do v y mà i u này không c n thi t
M,i th c thi trình phân tích s c n a m t URL n i m tin Androidster và s d ng cái này m m t k t n%i HTTP n trang Androidster Ho t ng ph$ bi n này c mô hình hóa m t cách t nhiên trong mã trình Java s
d ng l p c s tr u t ng nh trong Ví d 3
Ví d 3 L p trình phân tích i m tin c b n
L p c s l u tr feedUrl và s d ng nó m java.io.InputStream N u có b t k sai sót nào, n gi n nó th
m t RuntimeException, sao cho ng d ng d ng ho t ng m t cách nhanh chóng L p c s c(ng xác nh m t vài
h ng s% n gi n cho tên các th0 Ví d 4 trình bày m t s% n i dung m u t i m tin, qua ó b n có th th y c ý ngh a c a các th0 này
Ví d 4 i m tin XML m u
"
:&
"
:&
"
"
"
=
.
"
"
.
"
"
"
+,G 8,
Trang 4Nh b n có th th y t m u trong Ví d 4, m t ITEM t ng ng v i m t th hi n Message Các nút con c a m c
ch n (TITLE, LINK và v.v ) t ng ng các -c tính c a th hi n Message Vì b n bi t i m tin trông nh th nào
r i và có s+n t t c các ph n ph$ bi n, hãy xem làm th nào phân tách i m tin này s d ng các công ngh khác nhau có s+n trên Android B n s b)t u v i SAX
S d ng SAX
Trong môi tr 'ng Java, b n có th th 'ng xuyên s d ng SAX API khi b n mu%n có m t trình phân tích nhanh và mu%n h n ch t%i a vi c s d ng (footprint) b nh ng d ng c a b n i u ó khi n cho cho nó r t phù h p cho thi t
b di ng ch y Android B n có th s d ng SAX API nh là t môi tr 'ng Java, mà không c n n nh ng thay $i
-c bi t c n thi t ch y trên Android.Ví d 5 trình bày m t th c thi SAX c a giao di n FeedParser
Ví d 5 Th c thi SAX
4
3
% )4 - <L ( G88H 8F0<E0K< 98<88 3 %
3
3
% ) - <I ( G88H 8I0<J0G< 98<88 3 %
3
3 4
3
"
!
.
Trang 5N u tr c ây b n ã s d ng SAX, thì cái này trông c(ng khá quen thu c Nh v i b t k th c thi SAX nào, ph n l n các chi ti t u n m trong trình x lý SAX Trình x lý nh n các s ki n t trình phân tích SAX khi nó ch y nhanh qua tài li u XML Trong tr 'ng h p này, b n v a t o ra m t l p m i g i là RssHandler và "ng ký nó nh là m t trình x lý cho trình phân tích, nh trong Ví d 6
Ví d 6 Trình x lý SAX
L p RssHandler m r ng l p org.xml.sax.helpers.DefaultHandler L p này cung c p các th c thi m-c
nh, không thao tác cho t t c các ph ng th c t ng t các s ki n c t o ra b i trình phân tích SAX i u này cho phép các l p con ch! ghi chèn lên các ph ng th c khi c n thi t RssHandler có m t API b$ sung,
getMessages Cái này tr v danh sách các %i t ng Message mà trình x lý thu th p c khi nó nh n các s ki n
t trình phân tích SAX Nó có hai bi n trong khác, m t là currentMessage cho th hi n Message ang c phân tích, và m t là bi n StringBuilder g i là builder l u tr d li u ký t t các nút v"n b n Các bi n này u c
"
"
"
! 4
"
:&
"
:&
!
"
4 8!
"
"
:&
"
:&
"
"
"
Trang 6b)t u khi ph ng th c startDocument c d n ra khi trình phân tích g i s ki n t ng ng cho trình x lý Hãy xem ph ng th c startElement trong Ví d 6 Ph ng th c này c g i m,i khi b)t g-p th0 m trong tài li u XML B n ch! c n quan tâm khi nào th0 ó là th0 ITEM Trong tr 'ng h p ó, b n t o ra m t Message m i Bây gi' hãy nhìn vào ph ng th c characters Ph ng th c này c g i ra khi b)t g-p d li u ký t t các nút v"n b n D
li u d# dàng c thêm vào bi n builder Cu%i cùng hãy xem ph ng th c endElement Ph ng th c này c g i
ra khi b)t g-p th0 k t thúc %i v i các th0 t ng ng v i các -c tính c a m t Message, gi%ng nh TITLE và LINK,
-c tính thích h p c thi t -t trên currentMessage s d ng d li u t bi n builder N u th0 k t thúc là m t ITEM, thì currentMessage thêm vào danh sách Messages ây là s phân tích SAX r t i n hình; ây không có gì
là duy nh t %i v i Android Vì th n u b n bi t cách vi t m t trình phân tích SAX Java, thì b n bi t cách vi t m t trình phân tích SAX Android Tuy nhiên, Android SDK có b$ sung thêm m t s% tính n"ng thu n ti n vào SAX
Phân tích SAX d dàng h n
Android SDK có ch a m t l p ti n ích c g i là android.util.Xml Ví d 7 trình bày cách cài -t m t trình phân tích SAX v i cùng l p ti n ích nh th
Ví d 7 Trình phân tích SAX Android
L u ý là l p này v n s d ng trình x lý SAX chu*n, vì n gi n b n ã s d ng l i RssHandler nh trong Ví d 7 trên Vi c có th s d ng l i trình x lý SAX r t t%t, nh ng nó v n có ôi chút ph c t p v mã trình B n có t ng
t ng, n u b n ph i phân tích m t tài li u XML ph c t p h n r t nhi u, trình phân tích có th tr thành m nh t màu m1 cho các l,i Ví d , hãy xem l i ph ng th c endElement trong Ví d 6 L u ý cách ph ng th c này ki m tra
nh th nào n u currentMessage có giá tr không tr c khi nó c% cài -t các thu c tính? Bây gi' hãy nhìn vào XML
m u trong Ví d 4 L u ý r ng có các th0 TITLE và LINK n m ngoài các th0 ITEM ó là lý do t i sao ki m tra giá tr không c a vào N u không thì th0 TITLE u tiên có th gây ra m t NullPointerException Android bao
g m c bi n th SAX API c a chính nó (xem Ví d 8) lo i b& yêu c u b n ph i vi t trình x lý SAX c a chính b n
Ví d 8 Trình phân tích SAX Android n gi n
"
!
.
"
"
"
"
!
!
!!
"
"!
Trang 7Nh ã h a, mã phân tích SAX m i không s d ng trình x lý SAX Thay vào ó nó s d ng các l p t gói
android.sax trong SDK Các l p này cho phép b n mô hình hóa c u trúc c a tài li u XML c a b n và thêm m t trình nghe s ki n n u c n Trong mã trình trên, b n khai báo r ng tài li u c a b n s có m t ph n t g%c có tên rss và r ng
ph n t này s có ba ph n t con là channel Ti p n b n nói r ng channel s có ba ph n t con c g i là ITEM
và b n b)t u g)n các trình nghe %i v i m,i trình nghe, b n ã s d ng m t l p bên trong vô danh ã th c hi n giao
di n b n quan tâm (ho-c EndElementListner ho-c EndTextElementListener) Chú ý không c n ph i theo dõi
d li u ký t Vi c này không ch! n gi n h n mà th c s còn hi u qu h n Cu%i cùng, khi b n g i d n ph ng th c
ti n ích Xml.parse, bây gi' b n a vào trình x lý c t o ra t ph n t g%c
Toàn b mã trình trên trong Ví d 8 thu c lo i tùy ch n N u b n th y tho i mái v i mã trình phân tích SAX chu*n trong môi tr 'ng Java, thì b n có th tích vào ó N u b n mu%n th các trình bao b c ti n l i do Android SDK cung
c p, b n c(ng có th s d ng nó N u b n không mu%n s d ng SAX thì sao ây? V n còn có m t vài l a chon khác
L a ch n u tiên b n s th y ó là DOM
Làm vi c DOM
DOM phân tích trên Android c h, tr hoàn toàn Nó làm vi c chính xác nh khi nó làm vi c trong mã trình Java
mà b n s ch y trên máy tính bàn ho-c trên m t máy ch Ví d 9 trình bày m t th c thi d a trên DOM c a giao
di n trình phân tích
Ví d 9 Th c thi d a trên DOM c a m t trình phân tích i m tin
"
"!
.!
"
"!
"
"!
"
"!
.
"
"
"
"
!
.
Trang 8Gi%ng nh ví d SAX u tiên, không có gì là c th %i v i Android v mã trình này Trình phân tích DOM c t t c các tài li u XML vào b nh r i sau ó cho phép b n s d ng các DOM API ch y ngang qua cây XML, truy v n d
li u mà b n mu%n ây là mã trình r t d# làm, và, trong m t s% cách, còn n gi n h n c các th c thi d a trên SAX Tuy nhiên, thông th 'ng DOM tiêu t%n nhi u b nh h n vì tr c tiên m i th u c c vào b nh i u này có
th là m t v n trên thi t b di ng ch y Android, nh ng nó có th áp ng c trong m t vài tr 'ng h p s d ng
nh t nh mà dung l ng tài li u XML s không bao gi' quá l n Có th i u này ng ý r ng các nhà phát tri n
Android ã oán r ng trình phân tích SAX s ph$ bi n h n r t nhi u trên các ng d ng Android, do ó các ti n ích b$ sung c cung c p cho nó M t lo i trình phân tích XML khác c(ng có trên Android, và ó là trình phân tích kéo
Trình phân tích kéo XML
Nh ã c p trong các ph n tr c, Android không cung c p h, tr cho StAX API c a Java Tuy nhiên Android l i i kèm v i m t trình phân tích kéo làm vi c t ng t nh StAX Nó cho phép mã ng d ng c a b n kéo ho-c tìm ki m các s ki n t trình phân tích, trái ng c v i trình phân tích SAX t ng *y các s ki n cho trình x lý Ví d 10 miêu t m t th c thi trình phân tích kéo c a m t giao di n trình phân tích i m tin
Ví d 10 Th c thi d a trên trình phân tích kéo
"
"
"
!
"
"
"
"
"
! +
.
+ +
Trang 9Trình phân tích kéo làm vi c t ng t nh trình phân tích SAX Nó có các s ki n t ng t (ph n t b)t u, ph n t
k t thúc) nh ng b n ph i kéo t chúng (parser.next()) Các s ki n c g i i d i d ng các mã s%, vì th b n
có th s d ng m t case-switch n gi n Chú ý, thay vì nghe cho n khi k t thúc các ph n t nh trong phân tích SAX, v i trình phân tích kéo, th t d# dàng ti n hành h u h t các x lý ngay t u Trong mã trình trong Ví d 10, khi
m t ph n t b)t u, b n có th g i d n parser.nextText() kéo t t c d li u ký t t tài li u XML i u này mang n m t s n gi n hóa t%t cho phân tích SAX C(ng c n chú ý r ng b n -t m t c' (bi n boolean done)
nh n bi t khi nào b n n ph n k t thúc n i dung mà b n quan tâm i u này cho phép b n s m t m d ng vi c c tài
li u XML, vì b n bi t r ng mã trình s không quan tâm n ph n còn l i c a tài li u i u này có th r t h u ích, -c
bi t n u b n ch! c n m t ph n nh& tài li u ang c truy c p B n có th gi m áng k th'i gian phân tích b ng cách
d ng vi c phân tích càng s m càng t%t H n n a, ki u t%i u hóa này -c bi t quan tr ng trên thi t b di ng n i t%c
k t n%i có th ch m Trình phân tích kéo có m t vài u i m v hi u n"ng c(ng nh u i m s d ng d# dàng C(ng có th s d ng nó vi t XML
T o XML
n t n bây gi', tôi v n ã và ang t p trung phân tích XML t Internet Tuy nhiên, th!nh tho ng ng d ng c a b n
c n g i XML t i m t máy ch xa Hi n nhiên b n có th s d ng m t StringBuilder ho-c cái gì ó t ng t
t o ra m t chu,i XML M t thay th khác n a b)t ngu n t trình phân tích kéo trong Ví d 11
Ví d 11 Vi t XML b ng trình phân tích kéo
5 ) 5 !!
"
"
!
+
"
"
"
"
"
"
.
Trang 10L p XmlSerializer là m t ph n trong gói gi%ng nh XmlPullParser c dùng trong ph n tr c Thay vì kéo vào các s ki n, nó *y chúng ra n m t lu ng ho-c m t b ghi Trong tr 'ng h p này, nó d# dàng *y chúng sang
m t th hi n java.io.StringWriter Nó cung c p m t API n gi n cùng v i các ph ng th c b)t u và k t thúc m t tài li u, x lý các ph n t và thêm v"n b n ho-c các thu c tính ây có th là m t l a ch n thay th khá t%t cho vi c s d ng m t StringBuilder, vì d# dàng m b o XML c a b n chu*n xác
T ng k t
Lo i ng d ng nào b n mu%n xây d ng cho các thi t b Android? Dù là lo i nào i n a, n u nó c n làm vi c v i d
li u t Internet, thì có th nó c n ph i làm vi c v i XML Trong bài vi t này, b n ã th y r ng Android c tích h p
i cùng v i r t nhi u công c x lý XML B n có th ch n l y m t trong các công c ó nh là công-c -l a-ch n c a
b n, ho-c b n có th l a ch n c"n c vào tr 'ng h p s d ng Thông th 'ng s l a ch n an toàn là ch n cùng v i SAX, và Android cung c p cho b n c cách truy n th%ng th c hi n SAX và m t trình bao b c ti n l i khéo léo trên
c SAX N u tài li u c a b n nh&, thì có l DOM là cách n gi n h n nên theo N u tài li u c a b n l n, nh ng b n ch! c n m t ph n tài li u, thì trình phân tích kéo XML có l là cách hi u qu h n nên theo Cu%i cùng, vi t XML, gói trình phân tích kéo c(ng cung c p m t cách thu n ti n làm vi c ó Vì th , cái mà XML c a b n c n có là gì i
n a, thì Android SDK v n có cho b n
T i v
Tài nguyên
H c t p
Develop Android applications with Eclipse (Frank Ableson,developerWorks, 02/2008): Cách d# dàng nh t phát tri n các ng d ng Android là s d ng Eclipse Hãy tìm hi u t t c i u này trong bài h ng d n này Using integrated packages: Codehaus' Woodstox (Michael Galpin, developerWorks, 07/2007): Dành cho so sánh khác c a SAX, DOM, và trình phân tích kéo, hãy c bài vi t này
StAX'ing up XML, Part 2: Pull parsing and events (Peter Nehrer, developerWorks, December 2006): Cái nhìn sâu h n v trình phân tích kéo XML
Understanding SAX (Nicholas Chase, developerWorks, 07/2003): Tr thành chuyên gia v phân tích SAX v i bài h ng d n này
"
"
"
Thông tin v ph ng th c t i