Sử dụng Multithreading trong Android

burgerraraSoftware and s/w Development

Nov 18, 2013 (3 years and 4 months ago)

326 views

I.

Android là gì? Hệ điều hành android

và tại sao lại chọn
Android

Android là hệ điều hành trên điện thoại di động (và hiện nay là cả trên một
số đầu phát HD,
HD Player, TV) phát triển bởi Google và dựa trên nền tảng
Linux. Trước đây, Android được phát triển bởi công ty liên hợp Android (
sau đó được Google mua lại vào năm 2005).

Các nhà phát triển viết ứng dụng cho Android dựa trên ngôn ngữ Java. Sự ra
mắt của
Android vào ngày 5 tháng 11 năm 2007 gắn với sự thành lập của
liên minh

thiết bị cầm tay

mã nguồn mở, bao gồm 78 công ty

phần cứng,
phần mềm và viễn thông nhằm mục đính tạo nên một chuẩn mở cho điện
thoại di động trong tương lai.

Android ra đ
ời một HĐH nổi

tiếng là
iOS nhưng Android đang chiếm thị
phần 52,5% thiết bị di dộng. Tại sao nhiều người dùng chọn Android chứ
không phải iOS. Có rất nhiều lí do khiến cho Android khi mới ra mắt đã
vượt trên iOS và tính tiện dụng và nhiều thứ khác. Nhìn chung, Android
đáp
ứng được

tất cả những gì iOS làm được, thậm chí còn có phần vượt trội hơn
ở một số khía cạnh. Sau đây là một số tính năng Android thể hiện rõ sự vượt
trội so với iOS.

Android hiện thị thông tin thu

gọn tốt hơn so với iOS, Android cho phép
chạy chế độ đa nhiệm rất tốt, Android cho phép bạn tự do lựa chọn phần
cứng từ nhiều nhà cung cấp chứ không độc quyền như iOS.

Android cho phép bạn tùy chọn và cài đặt ROM
(các version)
theo ý thích,
giao diện được

thiết kế sao cho người sử dụng cảm thấy thuận tiện nhất. Với
Android, bạn có lựa chọn một chiếc điện thoại thông minh tùy vào hầu bao
của mình từ Trung cấp đến Cao cấp. Chính vì thế “ iOS làm mọi người biết
đến smartphone, còn Android đem smartphone đến c
ho mọi người” vì giá cả
phù hợp của nó.

Nhưng quan trọng nhất, kho ứng dụng của Android vô cùng phong phú,
không thua kém gì kho ứng dụng của iOS, không những thế chúng còn hầu
hết miễn phí, cách kết nối với Android Market và tải ứng dụng vô cùng dễ
dàng k
hiến cho Android dễ dàng được người sử dụng.

Tiếp cận với Multithreading

trong
lập trình
Android?

Trong lập trình ứng dụng cho di động,
một trong những vấn đề
người lập
trình cần giải quyết đó là tài nguyên hạn hẹp của các thiết bị động.

Các thiết
bị di động hầu hết có tài nguyên rất hạn chế, ngày nay tuy đã được cải thiện
rất nhiều

(nâng cấp CPU,GPU,RAM..)

nhưng nhìn chung lại, không thế
chạy ứng dụng trên các thiết bị di động như trên PC, laptop… do đó việc xử
lí các

thuật toán cần phải

tinh giản và thực hiện một cách nhanh nhất có thể
để có thể tiết kiệm được chi phí tài nguyên
.

Multi
threading

là một giải pháp có lẽ là bắt buộc đối với lập trình viên ứng
dụng nhằm tối ưu hóa hệ thống không những trên PC hay các thiết bị di
động (Androi
d)
. Multi
threading
trong lập trình Android sẽ được trình bày cụ
thể dưới đây.

II.

Thread và Multithreading

1.

Thread

Thread là đơn v


nh


nh

t c

a ti
ế
n trình đư

c đ

nh th

i b

i h


đi

u hành và
đư

c bao hàm trong các ti
ế
n trình th

c thi c

a máy tính
. M

i m

t
thread có
m

t callstack cho các phương th

c, đ

i s


và bi
ế
n c

c b


c

a thread đó.


Android ch

y trên m

t h


đi

u hành nhân Linux. Các

ng d

ng c

a Android
đư

c vi
ế
t b

ng ngôn ng


Java, và chúng ch

y trong m

t máy

o, đó không
ph

i máy

o Java(JVM) mà là má
y

o Dalvik

(Dalvik Virtual Machine).M

i
m

t máy

o Android khi ch

y đ

u có ít nh

t m

t thread chính khi kh

i đ

ng
và có th


còn vài thread khác dùng đ


qu

n lý các ti
ế
n trình đang ch

y.

ng
d

ng có th


t


kh

i đ

ng thêm các thread ph


vào các m

c đích c


th

.Các
thread trong cùng m

t máy

o tác đ

ng qua l

i và đư

c đông b


hóa b

ng
cách s


d

ng các đ

i tư

ng chia s


và các monitor liên quan đ
ế
n các đ

i


ng đó.

M

t Thread có th


là m

t background thread ho

c là m

t Foreground thread.
Theo m

c đ

nh, m

t t
hread m

i đư

c t

o s


là foreground, M

t

ng d

ng ch


k
ế
t thúc khi t

t c


ForeGround Thread đư

c k
ế
t thúc còn background thread
s


t


đ

ng b


tiêu h

y khi

ng d

ng End.

M

i Thread có m

t đ


ưu tiên (s


nguyên t


1
-

10) dùng đ


xác đ

nh lư

ng
th

i gian CPU (CPU time ) mà thread có th


s


d

ng d

a vào phương th

c
setPriority(int).

Phương th

c c

a Thread trong Android cũng gi

ng các phương th

c c

a
Thread trong Java như sl
eep(),wait() , notify() và notifyAll().


2.

Multi
threading

Multi
threading

có nghĩa là đa luồng, nhiều

thread. Với cơ chế đa luồng,
các ứng dụng của bạn có thể thực thi đồng thời nhiều dòng lệnh cùng lúc.
Có nghĩa là bạn có thể làm nhiều công việc đồng thời
trong cùng một ứng
dụng của bạn. Có thể hiểu một cách đơn giản: hệ điều hành với cơ chế đa
nhiệm cho phép nhiều ứng dụng chạy cùng lúc thì ứng dụng với cơ chế
đa luồng cho phép thực hiện nhiều công việc cung lúc. Chúng ta có đã có
multiprocessming nhưng cũ
ng phải cần đến multithreading.

Vì việc tạo ra và quản lí các process cần tốn nhiều tài nguyên hệ thống
hơn rất nhiều so với việc tạo ra một thread. Trong khi đó bạn có thể tạo
nhiều thread song song (ít tốn tài nguyên hệ thống hơn) để thực hiện
nhiều công

việc cùng lúc của process. Mỗi thread thực thi một công việc
hết sức đơn giản.

Khi bạn chạy một ứng dụng Android thì ứng dụng đó là một thread hoặc
là nhiều thread nếu dùng multithreading.

Như đã trình bày, mỗi khi chạy ứng dụng Android thì bạn đã tạo ra
thread. Dó chính là thread chính, để tạo ra một thread khác ngoài thread
chính trên, chúng ta có 2 cách tương tự như Java:



T

o 1 l

p m

i k
ế

th

a t


l

p java.lang.Thread và vi
ế
t ch

ng
phương th

c run() c

a l

p này



Cung cấp 1 biến thể (instance) của thread m
ới với đối tượng
Runnable trong quá trình khởi tạo thread này

.

V

i cách th


nh

t, chúng ta khai báo như sau:



class A extends Thread



{




Public void run()




{…}

}

A a = new A();

a.start();

………

V

i cách này các dòng l

nh c

a b

n s


đư

c đ

t trong method run().


V

i cách th


hai, ta khai báo như sau:


class B extends … implements Runable

{


Public void run()


{


…//

}

}

B b = new B();

Thread t= new Thread(b);

t.start();

……..

Cách th


hai v

n ph

i
t

o ra m

t đ

i tư

ng Thread

V

n đ


đ

t ra là phư

ng th

c nào t

t hơn, t

i ưu hơn. Th


nh

t, Android
(Java) không h


tr


đa k
ế

th

a, b

n ch


có th


extends t


m

t l

p duy nh

t, nhưng
l

i có th


implements cùng lúc nhi

u interface, khi ma l

p c

a b

n đã exte
nds m

t
l

p nào đó r

i thì ch


có th


implements Runnable. Th


hai,vi

c extends l

p
Thread r

i d

n t

i vi

c b

n có th


override l

i các phương th

c start, stop… mà
vi

c này có th


làm cho vi

c t

o thread là không th

. V

y cách t

t nh

t là
implements đ

i tư

ng Runnable.

M

t ví d


đơn gi

n: cho m

t đ

i tư

ng Runnable dung đ


hi

n th


1 đo

n
văn b

n
:


Ưu đi

m c

a vi

c s


d

ng Multithreading

M

c dù các thread chia s


các tài nguyên c

a ti
ế
n trình nh

ng v

n có th


đư

c th

c thi 1 cách đ

c l

p
.
Multi
-
thread h

u

d

ng khi dùng đ


l

p trình
đa
nhi

m, khi 1 chương trình ho

c ti
ế
n trình có s


c

, toàn b


h


th

ng s


v

n
an toàn.
Đ

c bi

t h

u d

ng trong trư

ng h

p m

t ti
ế
n trình duy nh

t mà sinh
ra nhi

u thread con c

a m

t h


th

ng đa nhi

m
.

Các

ng d

ng Multi
-
thread
ch

y nhanh hơn trên các máy tính h


tr


x


lý đa lu

ng

Như

c đi

m:


Khó khăn trong vi

c l

p trình, vi

c s


d

ng multithreading không h


d


dàng, ch


l

p trình viên có kinh nghi

m m

i x


lí t

t trong trư

ng h

p này. Khó
khăn trong vi

c qu

n lí đ

ng th

i, có

kh


năng ti

m tàng x

y ra tình trang
deadlock, vì v

y c

n ph

i nh

n d

ng, tránh ho

c x


lí deadlock khi nó x

y ra.


III.

S


d

ng Multithreading trong Android


--------------------------------------------------------------------------------------------

Android

cung c

p cho ch

ng ta hai phương th

c sau đ


làm vi

c v

i Thread.




Handler




Asyns Tasks



1.

Handler

Handler cho

phép g

i, x


lí các thông đi

p và các đ

i tương Runable có liên quan
đ
ế
n hàng đ

i thông đi

p. M

i th


hi

n Handler liên k
ế
t v

i m

t thread và hàng đ

i
thông đi

p c

a thread đó

Khi m

t ti
ế
n trình kh

i t

o

ng d

ng, main thread c

a nó đư

c chuyên d

ng đ


c
h

y m

t hàng đ

i thông đi

p s


qu

n lí các đ

i tư

ng

ng d

ng cao c

p và b

t kì
c

a s


nào nó t

o ra.

B

n có th


t

o ra m

t thread c

a riêng b

n và giao ti
ế
p ngư

c
v

i main thread c

a

ng d

ng thông qua m

t Handler.

Đi

u này đư

c th

c hi

n
gi

ng như trư

c
đây b

ng cách g

i sendMessage nhưng t


thread
m

i
c

a b

n.

Khi b

n t

o m

t đ

i tư

ng t


class Handler, thì í s


x


lý hai đ

i tư

ng đó là
Messages và Runable quan h


v

i Message
-
Queue hi

n t

i. Hàng đ

i message
ch

a các công vi

c c

n th

c thi theo c


ch
ế

FIFO. B

n s


c

n Handler m

i
Activity n

i mà background thread s


thông tin t

i đ


update U


Khi b

n t

o ra m

t Handler m

i, nó b


ràng bu

c vào thread và hàng đ

i thông
đi

p đư

c t

o b

i thread đó, t


đó, nó s


cung c

p các thông đi

p và runable t

i
hàng
đ

i thông đi

p đó và th

c thi cho đ
ế
n khi chúng ra kh

i hàng đ

i thông đi

p

Có 2 cách s


d

ng l

p Handler
: đ

nh th

i thông đi

p và runable th

c thi t

i m

t
th

i đi

m trong tương lai, s

p x
ế
p
m

t hành đ

ng

đư

c th

c hi

n trên

thread khác.





Trên đây là sơ đ


s


d

ng Handler cơ b

n. B

n có th


tìm hi

u cho ti
ế
t thêm
v


Handler trong link sau:
http://developer.android.com/reference/android/os/Handler.html





Các
thread th


c

p giap ti
ế
p v

i thread chính yêu c

u m

t thông đi

p b

ng
cách s


d

ng phương th

c obtainMessage()
.
Khi đã đư

c t

o ra, thread n

n
có th


truy

n d


li

u vào thông đi

p và
g

i
vào hàng đ

i thông đi

p c

a
Handler b

ng cách s


d

ng phương th

c se
ndMessage().
Handler s


d

ng
phương th

c handleMessage() đ


ti
ế
p nh

n các thông đi

p đ
ế
n t
h
read chính
.
M

t thông đi

p đư

c rút ra t


hàng đ

i c

a ti
ế
n trình có th


tr


v


m

t s


d


li

u cho ti
ế
n trình chính ho

c yêu c

u th

c thi các đ

i tư

ng runnable b

ng
phương th

c post().



Đ


g

i

1 thông đi

p đ
ế
n 1 Handler, thread trư

c h
ế
t ph

i g

i phương th

c
obtainMessage() đ


l

y thông đi

p
,
c
ó 1 vài d

ng phương th

c
obtainMessage() cho phép b

n ch


t

o ra 1 đ

i tư

ng Message r

ng ho

c
có tham s





Phương th

c
sendMessage(Message msg) đ

t thông đi

p msg vào cu

i hàng
đ

i, sau các thông đi

p đang ch

, trư

c th

i gian hi

n t

i (đây là th

i gian
mà thông đi

p s


đư

c th

c thi)




Phương th

c Post(Runnable r) s


thêm đ

i tư

ng Runnable r vào hàng đ

i
thông đi

p và s


đư

c th

c thi trên thread g

n v

i handler g

i phương th

c
post()




2.

S


d

ng AsyncTask


Khái báo m

t l

p và k
ế

th

a l

i l

p AsyncTask như sau:




AsyncTask cho phép s


d

ng d


dàng các UI Thread



L

p này cho phép th

c hi

n trên các ho

t đ

ng n

n và đưa ra
k
ế
t qu


trên UI
Thread mà không c

n ph

i thao tác v

i Thread ho

c hander.



M

t AsyncTask đư

c đ

nh nghĩa b

i m

t phép tính toán ch

y trên
background thread và k
ế
t qu


đư

c công b


trên UI Thread



M

t AsyncTask đư

c đ

nh nghĩa b

i:



AsyncTask <Params, Progr
ess, Result>

Trong đó

Params: Lo

i các tham s


đư

c g

i đ
ế
n nhi

m v


khi th

c thi.

Progress: Lo

i c

a các đơn v


Progress đư

c đưa ra trong n

n tính toán.

Result: Lo

i c

a k
ế
t qu


tính toán n

n.


Không ph

i t

t c


các ki

u luôn đư

c s


d

ng b

i AsyncTask.
Đ


không s


d

ng m

t lo

i tham s


thì ch


c

n s


d

ng ki

u Void.


Chú ý:

Cú pháp "
String
...
"
cho th

y

(
Varargs)
m

ng

các giá tr


String
,
tương t


như

"
String [
]"




Ví d

: S


d

ng l

p AsyncTask



Nhiệm vụ chính gọi AsyncTask để làm một số công việc
chậm. Các phương pháp
AsyncTask làm yêu cầu tính toán và định kỳ cập nhật giao diện người dùng chính.
Trong ví dụ của này nền hoạt động thỏa thuận bằng các dòng text của các dòng
trong hộp văn bản, và cũng có thể kiểm soát thanh progress.