Tải bản đầy đủ (.docx) (69 trang)

Xây dựng chương trình download video từ trang web youtube com cho điện thoại di động

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (1.37 MB, 69 trang )

LỜI CAM ĐOAN

Tôi xin cam đoan rằng đồ án tốt nghiệp : “Xây dựng chương trình
download video từ trang web youtube.com cho điện thoại di động” là công
trình nghiên cứu của bản thân tôi. Các nội dung nghiên cứu và kết quả trong đề
tài này là hoàn toàn trung thực và chưa từng được công bố trong bất cứ công
trình nào trước đây. Các module và các thông số trong chương trình demo là kết
quả của quá trình thực hiện đồ án của tôi. Ngoài ra tôi còn sử dụng một số kiến
thức, thông tin của các tác giả khác đã được thể hiện trong phần tài liệu tham
khảo.
Nếu phát hiện có bất sự gian lận nào tôi xin chịu trách nhiệm trước Hội
đồng, cũng như kết quả đồ án của mình.

Thái Nguyên, tháng 06 năm 2012
Sinh viên thực hiện đồ án :

Hoàng Chí Ngụy

1


LỜI CẢM ƠN

Trước tiên tôi xin dành lời cảm ơn chân thành và sâu sắc tới các thầy giáo,
cô giáo trong trường Đại học Công Nghệ Thông Tin Và Truyền Thông và các
thầy cô giáo trong khoa Công Nghệ Thông Tin, bộ môn Mạng và Truyền Thông
nói riêng đã tận tình giảng dạy truyền đạt cho tôi nhứng kiến thức, kinh nghiệm
quí báu trong suốt thời gian vừa qua.
Đặc biệt tôi xin gửi lời cảm ơn tới cô giáo ThS.Nguyễn Thị Mai Phương,
cô đã tận tình giúp đỡ, trực tiếp chỉ bảo, hướng dẫn tôi trong suốt quá trình làm
đồ án tốt nghiệp. Trong thời gian làm việc với cô, tôi không ngừng tiếp thu


thêm nhiều kiến thức bổ ích mà còn học tập được tinh thần làm việc, thái độ
nghiên cứu nghiêm túc, hiệu quả. Đây là những điều rất cần thiết cho em trong
quá trình học tập và công tác sau này.
Ngoài ra, trong quá trình thực hiện đồ án tôi còn nhận được rất nhiều sự
động viên và giúp đỡ từ phía gia đình, người thân và tập thể các bạn trong lớp.
Do đó kết quả cũng như tính khả dụng của bài luận văn này trong thực tế là lời
cảm ơn sâu sắc nhất của tôi gửi tới mọi người và là nguồn động lực để tôi có thể
tự tin vào các kiến thức mình đã thu được sau khi tốt nghiệp.

Thái Nguyên, tháng 06 năm 2012
Sinh viên thực hiện đồ án :

Hoàng Chí Ngụy

2


MỤC LỤC

3


DANH MỤC HÌNH ẢNH

4


DANH MỤC BẢNG BIỂU

5



LỜI NÓI ĐẦU

Hiện nay, cùng với sự phát triển mạnh mẽ của công nghệ thông tin nhu cầu
của con người về việc chia sẻ video ngày càng trở nên phổ biến và tiện lợi hơn.
Trong thế giới ngày nay, cách đơn giản và nhanh nhất để ta có thể được biết đến
và nổi tiếng trên toàn thế giới chính là thông qua Internet. Cùng với sự phát
triển của máy tính bảng, điện thoại thông minh giúp cho con người có nhiều lựa
chọn hơn để trao đổi thông tin. Người sử dụng có thể sử dụng các mạng xã hội
hoặc các trang web chia sẻ hình ảnh và video để đăng tải thông tin của mình,
giúp cho việc kết nối bạn bè được thuận lợi hơn. Youtube.com cũng là một
trong số các trang web ra đời với mục đích chia sẻ video. Tuy nhiên, cùng với
sự phát triển của công nghệ thông tin trang web này hiện tại không chỉ đăng tải
video cá nhân mà còn bao gồm rất nhiều loại như: âm nhạc, truyền hình, phim
ảnh …. Lợi ích của trang web là rất thực tế, nhưng có một điều đáng tiếc là
trang web này chỉ hỗ trợ người dùng upload lên miễn phí mà không hỗ trợ tải
video về. Chương trình của tôi xây dựng nhằm giúp cho người sử dụng có thể
download được video yêu thích về chính điện thoại của mình, giúp cho người
dùng có thể chủ động hơn trong việc chia sẻ và quản lý các video.
Với những dòng chữ đầu tiên này, tôi xin dành để gửi lời cảm ơn chân
thành và sâu sắc nhất tới cô giáo : ThS.Nguyễn Thị Mai Phương người đã tận
tình hướng dẫn, chỉ bảo và tạo cho tôi những điều kiện tốt nhất từ khi bắt đầu
cho tới khi hoàn thành đồ án của mình.
Thái Nguyên, tháng 06 năm 2012
Sinh viên thực hiện đồ án :

Hoàng Chí Ngụy

6



Chương 1 : CƠ SỞ LÝ THUYẾT
1.1 Tìm hiểu chung về Java
Java là một ngôn ngữ lập trình được Sun Microsystems giới thiệu vào tháng
6 năm 1995. Từ đó, nó đã trở thành một công cụ lập trình của các lập trình viên
chuyên nghiệp. Java được xây dựng trên nền tảng của C và C++. Do vậy nó sử
dụng các cú pháp của C và các đặc trưng hướng đối tượng của C++.
Vào năm 1991, một nhóm các kỹ sư của Sun Microsystems có ý định thiết
kế một ngôn ngữ lập trình để điều khiển các thiết bị điện tử như tivi, máy giặt,
lò nướng, … Mặc dù C và C++ có khả năng làm việc này nhưng trình biên dịch
lại phụ thuộc vào từng loại CPU.
Trình biên dịch thường phải tốn nhiều thời gian để xây dựng nên rất đắt. Vì
vậy để mỗi loại CPU có một trình biên dịch riêng là rất tốn kém. Do đó nhu cầu
thực tế đòi hỏi một ngôn ngữ chạy nhanh, gọn, hiệu quả và độc lập thiết bị tức
là có thể chạy trên nhiều loại CPU khác nhau, dưới các môi trường khác nhau.
“Oak” đã ra đời và vào năm 1995 được đổi tên thành Java. Mặc dù mục tiêu ban
đầu không phải cho Internet nhưng do đặc trưng không phụ thuộc thiết bị nên
Java đã trở thành ngôn ngữ lập trình cho Internet.
Java là một công nghệ xây dựng các ứng dụng phần mềm có vị trí rất lớn
trong những năm cuối thế kỉ 20, đầu thế kỉ 21. Nó được coi là công nghệ mang
tính cách mạng và khả thi nhất trong việc tạo ra các ứng dụng có khả năng chạy
thống nhất trên nhiều nền tảng mà chỉ cần biên dịch một lần. Ngày nay, Java là
một nền tảng tất yếu của các ứng dụng quy mô lớn của các doanh nghiệp nhờ
vào khả năng mở rộng cũng như những nền tảng vô cùng phong phú mà nó
cung cấp. Java đã trải qua 3 bước phát triển quan trọng: Java 1.0 gắn liền với
bản JDK đầu tiên, Java 2 gắn với JDK 1.2 và Java 5 gắn với J2SDK 1.5.
Đối với Java người ta không còn nhắc đến như là 1 ngôn ngữ lập trình mà nhắc
đến một công nghệ hay một nền tảng phát triển, nó bao gồm các bộ phận:


7


-

Máy ảo Java: JVM

-

Bộ công cụ phát triển: J2SDK

-

Các đặc tả chi tiết kĩ thuật (specifications)

-

Ngôn ngữ lập trình (programming language)

-

Các công nghệ đi kèm như JSP, Servlet, EJB, JDBC, JNDI, JMX, RMI…

và framework như Struts, Spring, JSF, Hibernate, JavaFX ...
Nhũng ưu điểm của java :
• Đơn giản (simple): Java đơn giản vì, mặc dù dựa trên cơ sở C++ nhưng Sun đã

cẩn thận lược bỏ các tính năng khó nhất của C++ để làm cho ngôn ngữ này dễ
sử dụng hơn. Là một ngôn ngữ lập trình hoàn toàn mới, nó buộc phải có dáng
vẻ và sự cảm nhận tương tự như các ngôn ngữ phổ biến hiện hành đồng thời

đòi hỏi khoảng thời gian huấn luyện lại tối thiểu và thân thiện hơn với người
dùng. Do đơn giản, ngôn ngữ này cũng rất nhỏ - nên nhớ rằng từ đầu nó đã
được xây dựng để dùng cho điện tử dân dụng như đầu chạy bằng video và hộp
điều khiển từ xa, những thiết bị có không gian lưu trữ rất hạn chế.
• Hướng đối tượng (Object Oriented): Hướng đối tượng trong Java tương tự như

C++ nhưng Java là một ngôn ngữ lập trình hướng đối tượng hoàn toàn. Tất cả
mọi thứ đề cập đến trong Java đều liên quan đến các đối tượng được định
nghĩa trước, thậm chí hàm chính của một chương trình viết bằng Java (đó là
hàm main) cũng phải đặt bên trong một lớp. Hướng đối tượng trong Java
không có tính đa kế thừa (multi inheritance) như trong C++ mà thay vào đó
Java đưa ra khái niệm interface để hỗ trợ tính đa kế thừa.
• Hiểu mạng (network-savvy): Java được lập ra để hoạt động trên mạng và có các
thủ tục để có thể quản lý các giao thức mạng như TCP/IP, FTP và HTTP. Nói
cách khác, Java được xây dựng để thực hiện hoàn toàn thích hợp trên Internet.
Chương trình Java thậm chí có thể xâm nhập vào các đối thượng khác thông
qua Internet bằng cách sử dụng URL (địa chỉ Web) để định vị chúng.

8


• Mạnh mẽ (robust): Khả năng mạnh phải phù hợp với thiết kế của ngôn ngữ, và

hướng nó vào việc khắc phục những hư hỏng bộ nhớ và đảm bảo tính toán vẹn
dữ liệu. Ví dụ, Java có tính năng "automatic garbage collection" (tự động thu
gom rác) - có nghĩa là bộ nhớ được giải phóng một cách tự động - nên lập
trình viên không phải bận tâm về việc quản lý bộ nhớ và nhờ đó ít có xu
hướng làm những việc gây hỏng bộ nhớ.
• An toàn (secure): Khả năng hướng mạng của Java tự động đưa ra yêu cầu về an
toàn. Đặc tính an toàn của ngôn ngữ lập trình này bắt nguồn từ việc nó có

những phần hạn chế được cài sẵn nhằm đề phòng các chương trình Java thực
hiện những chức năng như ghi vào ổ cứng của người dùng hay cho phép virus
từ mạng hoặc từ môi trường phân tán thâm nhập vào.
• Độc lập với cấu trúc (architecture neutral): Đây là thuộc tính đặc sắc nhất của
Java. Java được tạo ra với tiêu chí "Viết (code) một lần, thực thi khắp nơi"
("Write Once, Run Anywhere" (WORA)). Tính năng biên dịch một lần và
chạy nhiều nền có thể đạt được nhờ just-in-time compiler (JIT), chuyển mã
bytecode của Java sang mã máy khi chương trình đang chạy. Chương trình
phần mềm viết bằng Java có thể chạy trên mọi nền tảng (platform) khác nhau
thông qua một môi trường thực thi với điều kiện có máy ảo java thích hợp hỗ
trợ nền tảng đó. Môi trường thực thi của Sun Microsystems hiện hỗ trợ Sun
Solaris, Linux, Mac OS, FreeBSD , Windows và nhiều hệ thống cài đặt trên
các thiết bị di động.
• Di động (portable): Đối với một phạm vi rộng, Java là loại có thể di chuyển nhờ
khả năng độc lập với hệ máy. Đồng thời, các loại dữ liệu, giao diện, cũng như
dáng vẻ và cảm nhận của Java đều giống nhau trên mọi hệ máy. Hệ thống các
thành phần của java cũng có tính di động cao - nó được viết bằng Java.
• Thông dịch (Interpreter): Java là một ngôn ngữ lập trình vừa biên dịch vừa
thông dịch. Chương trình nguồn viết bằng ngôn ngữ lập trình Java có đuôi
*.java đầu tiên được biên dịch thành tập tin có đuôi *.class và sau đó sẽ được
trình thông dịch thông dịch thành mã máy. Để chạy Java bytecode, cần cài đặt
JRE (Java Runtime Environment). JRE cung cấp các thư viện cơ bản, Java
Virtual Machine, plugin cho trình duyệt, và những thứ khác.

9


• Tốc độ cao (high perfprmance): Khi Sun Microsystems mô tả Java có tốc độ

cao, có lẽ họ muốn nói về mã bytecode được thông dịch hiệu quả như thế nào

( Java thường chạy nhanh hơn những ngôn ngữ lập trình thông dịch khác
như Python, Perl, PHP...). Về tốc độ các applet hay chương trình Java thì nói
chung đều chậm hơn các chương trình Java thì nói chung đều chậm hơn các
chương trình được biên dịch viết bằng C++, vì chương trình này đã được tối
ưu hoá từ trước cho hệ máy nhất định. Java đã phải trả giá về hiệu suất cho
tính không phụ thuộc hệ của nó.
• Đa luồng (multithreaded): Đa luồng có nghĩa là ngôn ngữ Java cho phép xây
dựng trình ứng dụng, trong đó, nhiều quá trình có thể xảy ra đồng thời. Tính
đa luồng cho phép các nhà lập trình có thể biên soạn phần mềm đáp ứng tốt
hơn, tương tác tốt hơn, và thực hiện theo thời gian thực.
• Tính động (dynamic): Java động vì nó được thiết kế để đáp ứng với môi trường
tác nghiệp luôn trong tình trạng thay đổi. Khi có yêu cầu mới xuất hiện trên
thị trường, các loại đối tượng mới có thể được bổ sung vào ngay.
1.2 Tổng quan về J2ME
1.2.1 Lịch sử phát triển của J2ME
J2ME được phát triển từ kiến trúc Java Card, Embeded Java và Personal
Java của phiên bản Java 1.1. Đến sự ra đời của Java 2 thì Sun quyết định thay
thế Personal Java và đươc gọi với tên mới là Java 2 Micro Edition, hay viết tắt
là J2ME. Đúng với tên gọi, J2ME là nền tảng cho các thiết bị có tính chất nhỏ,
gọn.

10


Hình 1.1 : Các phiên bản của J2ME
1.2.2 Kiến trúc của J2ME

Hình 1.2 : Kiến trúc của J2ME
Giới thiệu các thành phần trong nền tảng J2ME:
Định nghĩa về Configuration (Cấu hình): là đặc tả định nghĩa một môi

trường phần mềm cho một dòng các thiết bị được phân loại bởi tập hợp các đặc
tính, ví dụ như :
• Kiểu và số lượng bộ nhớ
• Kiểu và tốc độ bộ vi xử lý
• Kiểu mạng kết nối
Do đây là đặc tả nên các nhà sản xuất thiết bị như Samsung, Nokia … bắt
buộc phải thực thi đầy đủ các đặc tả do Sun qui định để các lập trình viên có thể
dựa vào môi trường lập trình nhất quán và thông qua sự nhất quán này, các ứng
dụng được tạo ra có thể mang tính độc lập thiết bị cao nhất có thể. Ví dụ như
một lập trình viên viết chương trình game cho điện thoại Samsung thì có thể sửa
đổi chương trình của mình một cách tối thiểu nhất để có thể chạy trên điện
thọai Nokia..

11


Hiện nay Sun đã đưa ra 2 dạng Configuration:
• CLDC (Connected Limited Device Configuration- Cấu hình thiết bị kết nối
giới hạn): được thiết kế để nhắm vào thị trường các thiết bị cấp thấp (low-end),
các thiết bị này thông thường là máy điện thọai di động và PDA với khoảng 512
KB bộ nhớ. Vì tài nguyên bộ nhớ hạn chế nên CLDC được gắn với Java không
dây (Java Wireless ), dạng như cho phép người sử dụng mua và tải về các ứng
dụng Java, ví dụ như là Midlet.


CDC- Connected Device Configuration (Cấu hình thiết bị kết nối): CDC

được đưa ra nhắm đến các thiết bị có tính năng mạnh hơn dòng thiết bị thuộc
CLDC nhưng vẫn yếu hơn các hệ thống máy để bàn sử dụng J2SE. Những thiết
bị này có nhiều bộ nhớ hơn (thông thường là trên 2Mb) và có bộ xử lý mạnh

hơn. Các sản phẩm này có thể kể đến như các máy PDA cấp cao, điện thoại
web, các thiết bị gia dụng trong gia đình … Cả 2 dạng Cấu hình kể trên đều
chứa máy ảo Java (Java Virtual Machine) và tập hợp các lớp (class) Java cơ bản
để cung cấp một môi trường cho các ứng dụng J2ME. Tuy nhiên, ta chú ý rằng
đối với các thiết bị cấp thấp, do hạn chế về tài nguyên như bộ nhớ và bộ xử lý
nên không thể yêu cầu máy ảo hổ trợ tất cả các tính năng như với máy ảo của
J2SE. Ví dụ, các thiết bị thuộc CLDC không có phần cứng yêu cầu các phép
tính toán dấu phẩy động, nên máy ảo thuộc CLDC không được yêu cầu hỗ trợ
kiểu float và double.

12


Hình 1.3 : Hai loại Configuration CDC và CLDC.
Bảng dưới là sự so sánh các thông số kỹ thuật của CDC và CLDC :
CLDC

CDC

Ram

>=32K, <=512K

>=256K

Rom

>=128k, <=512k

>=512k


Nguồn NăngLượng

Giới Hạn (nguồn pin)

Không giới hạn

Network

Chậm

Nhanh

Bảng 1.1: Bảng so sánh các thông số kỹ thuật của CDC và CLDC.
Định nghĩa về Profile: Profile mở rộng Configuration bằng cách thêm vào
các class để bổ trợ các tính năng cho từng thiết bị chuyên biệt. Cả 2
Configuration đều có những profile liên quan và từ những profile này có thể
dùng các class lẫn nhau. Đến đây ta có thể nhận thấy do mỗi profile định nghĩa
một tập hợp các class khác nhau, nên thường ta không thể chuyển một ứng dụng
Java viết cho một profile này và chạy trên một máy hỗ trợ một profile khác.
Cũng với lý do đó, ta không thể lấy một ứng dụng viết trên J2SE hay J2EE và
chạy trên các máy hỗ trợ J2ME. Sau đây là các profile tiêu biểu:

13


• Mobile Information Device Profile (MIDP): profile này sẽ bổ sung các tính
năng như hỗ trợ kết nối, các thành phần hỗ trợ giao diện người dùng… vào
CLDC. Profile này được thiết kế chủ yếu để nhắm vào điện thọai di động với
đặc tính là màn hình hiển thị hạn chế, dung lượng chứa có hạn. Do đó MIDP sẽ

cung cấp một giao diện người dùng đơn giản và các tính năng mạng đơn giản
dựa trên HTTP. Có thể nói MIDP là profile nổi tiếng nhất bởi vì nó là kiến thức
cơ bản cho lập trình Java trên các máy di động (Wireless Java).
• PDA Profile: tương tự MIDP, nhưng với thị trường là các máy PDA với màn
hình và bộ nhớ lớn hơn.
Ngoài ra còn có Personal Basis Profile, Personal Profile, RMI Profile, Game
Profile.
1.2.3 Giới thiệu về MIDP
a) Định nghĩa
Đây là Profile được định nghĩa dành riêng cho các thiết bị di động và là
thành phần chính trong J2ME. MIDP cung cấp các chức năng cơ bản cho hầu
hết các dòng thiết bị di động phổ biến nhất như các máy điện thoại di động và
các máy PDA. Tuy nhiên MIDP không phải là cây đũa thần cho mọi lập trình
viên vì như chúng ta đã biết, MIDP được thiết kế cho các máy di động có cấu
hình rất thấp.Trong phần sau tôi sẽ liệt kê qua các tính năng mà MIDP cung cấp
và những giới hạn của nó.
b) Những chức năng MIDP cung cấp
-

Các lớp và kiểu dữ liệu: Phần lớn các lớp mà các lập trình viên Java

quen thuộc vẫn còn được giữ lại. Ví dụ như các lớp trong gói java.util như
Stack,Vector và Hastable cũng như Enumeration.

14


-

Hỗ trợ đối tượng Display: Đúng như tên gọi một chương trình MIDP sẽ


hỗ trợ duy nhất một đối tượng Display là đối tượng quản lý việc hiển thị dữ
liệu trên màn hình điện thoại.
-

Hỗ trợ Form và các giao diện người dùng.

-

Hỗ trợ Timer và Alert.

-

Cung cấp tính năng RecordManagementSystem(RMS) cho việc lưu trữ

dữ liệu.
-

Ngoài ra vào tháng 11 năm 2003 Sun đã tung ra MIDP 2.0 với hàng loạt

tính năng khác được cung cấp thêm so với bản 1.0. Những cải tiến nổi bật so
với MIDP 1.0:
-

Nâng cấp các tính năng bảo mật như:
 Download qua mạng an toàn hơn qua việc hỗ trợ giao thức HTTPS.
 Kiểm soát việc kết nối giữa máy di động và server: Ví dụ như các

chương trình không thể kết nối tới server nếu thiếu sự chấp thuận của
người sử dụng.

- Thêm các API hỗ trợ Multimedia. Một trong nhưngcải tiến hấp dẫn nhất của

MIDP 2.0 là tập các API media của nó.Các API này là một tập con chỉ hỗ trợ
âm thanh của Mobile Media API (MMAPI).
- Mở rộng các tính năng của Form. Nhiều cải tiến đã được đưa vào API

javax.microedition.lcdui trong MIDP2.0, nhưng các thay đổi lớn nhất (ngoài
API cho game) là trong Form và Item.
- Hỗ trợ các lập trình viên Game bằng cách tung ra Game API: Có lẽ Sun đã kịp

nhận ra thị trường đầy tiềm năng của các thiết bị di động trong lĩnh vực
Game.Với MIDP 1.0 thì các lập trình viên phải tự mình viết code để quản lý
các hành động của nhân vật cũng như quản lý đồ họa.Việc này sẽ làm tăng
kích thước file của sản phẩm cũng như việc xuất hiện các đoạn mã bị lỗi.
Được hưởng lợi nhất từ Game API trong MIDP 2.0 không chỉ là các lập trình
viên Game mà còn là các lập trình viên cần sử dụng các tính năng đồ họa cao
cấp.Ý tưởng cơ bản của GameAPI là việc giả định rằng một màn hình game là
15


tập hợp các layer(lớp). Với Game API nhà phát triển còn được cung cấp các
tính năng như quản lý các thao tác bàn phím.
- Hỗ trợ kiểu ảnh RGB: một trong những cải tiến hấp dẫn cho các nhà phát triển
MIDP là việc biểu diễn hình ảnh dưới dạng các mảng số nguyên, cho phép
MIDlet thao tác với dữ liệu hình ảnh một cách trực tiếp.
Những hạn chế của MIDP :
- Phép tính dấu phẩy động (floating point): Phép tính này đòi hỏi rất nhiều tài

nguyên CPU và phần lớn các CPU cho các thiết bị di động không hỗ trợ phép
tính này,do đó MIDP cũng không có.

- Bộ nạp class (Class Loader).
- Hỗ trợ từ khóa finalize() như trong J2SE: Việc “dọn dẹp“ tài nguyên trước khi
nó bị xóa được đẩy về phía các lập trình viên.
- Không hỗ trợ JNI.
- Hỗ trợ hạn chế thao tác bắt lỗi.
- Phần lớn các thư viện API cho Swing và AWT không thể sử dụng được trong
MIDP.
- Không hỗ trợ các tính năng quản lý file và thư mục: Đây có thể làm ta ngạc
nhiên nhưng thực tế là các thiết bị J2ME không có hỗ trợ các thiết bị lưu trữ
thông thường như ổ cứng…. Tuy nhiên, điều đó không có nghĩa là ta phải
mất đi mọi dữ liệu quan trọng mỗi khi tắt thiết bị. Sun đã cung cấp một chức
năng khác tương đương gọi là Record Management System (RMS) để cung
cấp khả năng lưu trữ cho các thiết bị này.
1.2.4 MIDlet
MIDlet là viết tắt của “Mobile Information Device applet”. Hầu hết các ứng
dụng mà ta thấy trên điện thoại di động đều là MIDlet. Một MIDlet kế thừa từ
lớp : javax.microedition.midlet.MIDlet và thực thi ít nhất các phương thức cơ
bản sau: startApp(), pauseApp(), và destroyApp(). Trong một ứng dụng của ta
gồm có nhiều lớp thì có thể chỉ cần một lớp kế thừa MIDlet.
Dưới đây là vòng đời của một MIDlet:

16


Hình 1.4 : Vòng đời của một MIDlet.
• Đối tượng Display: Mỗi MIDlet có một tham chiếu đến một đối tượng Display.

Đối tượng này cung cấp các thông tin về màn hình cũng như một số phương
thức cần cho việc hiển thị các đối tượng khác trên màn hình. Có thể xem
Display là đối tượng có nhiệm vụ quản lý việc hiển thị của màn hình. Chức

năng của nó là quyết định danh sách các thành phần cần xuất hiện trên màn
hình cũng như thời điểm phù hợp để hiển thị chúng.
• Đối tượng Displayable: Mặc dù mỗi MIDlet chỉ có duy nhất một đối tượng
Display nhưng nó lại có thể có rất nhiều đối tượng Displayable. Điều đó có
nghĩa là một đối tượng Display có thể hiển thị bao nhiêu đối tượng
Displayable tùy ý. Đối tượng Displayable là đối tượng có thể nhìn thấy được
một cách trực quan trên màn hình. Bản thân MIDP có chứa 2 lớp con của
Displayable là Screen và Canvas.
1.2.5 Hệ thống bản ghi
MIDP không sử dụng hệ thống file để lưu trữ dữ liệu. Thay vào đó MIDP
lưu toàn bộ thông tin vào non-volatile memory bằng hệ thống lưu trữ gọi là
Record Management System (RMS).
17


a)

Lưu trữ cố định thông qua Record Srore
RMS là hệ thống được tổ chức và quản lý dưới dạng các record (bản ghi).

Mỗi bản ghi (sau này gọi là Record) có thể chứa bất kỳ loại dữ liệu nào, chúng
có thể là kiểu số nguyên, chuỗi ký tự hay có thể là một ảnh và kết quả là một
Record là một chuỗi (mảng) các byte. Nếu mã hoá dữ liệu dưới dạng nhị phân
(binary), ta có thể lưu trữ dữ liệu bằng Record sau đó đọc dữ liệu từ Record và
khôi phục lại dữ liệu ban đầu. Tất nhiên kích thước dữ liệu của ta không được
vuợt quá giới hạn qui định của thiết bị di động. RMS lưu dữ liệu gần như một
cơ sở dữ liệu, bao gồm nhiều dòng, mỗi dòng lại có một số định danh duy nhất.
Một cơ sở dữ liệu kiểu bản ghi:
Record ID Data
1


Array of bytes

2

Array of bytes

3

Array of bytes

Bảng 1.2: Bảng một số kiểu dữ liệu của RecordStore.
Một tập các bản ghi (sau này gọi là RecordStore) là tập hợp các Record được
sắp xếp có thứ tự. Mỗi Record không thể đứng độc lập mà nó phải thuộc vào
một RecordStore nào đó, các thao tác trên Record phải thông qua Record Store
chứa nó. Khi tạo ra một Record trong RecordStore, Record được gán một số
định danh kiểu số nguyên gọi là Record ID. Record đầu tiên được tạo ra sẽ
được gán Record ID là 1 và sẽ tăng thêm 1 cho các Record tiếp theo. Cần chú
rằng Record ID không phải là chỉ mục (index), các thao tác xóa Record trong
RecordStore sẽ không gây nên việc tính toán lại các Record ID của các Record
hiện có cũng như không làm thay đổi Record ID của các Record được tạo mới.
Data là một dãy các byte đại diện cho dữ liệu cần lưu. Tên được dùng để phân
biệt các RecordStore trong bộ các MIDlet (MIDlet suite). Cần chú ý khái niệm
MIDlet suite là tập các MIDlet có chung không gian tên (name space), có thể
chia sẽ cùng tài nguyên (như Record Store), các biến tĩnh (static variable) trong
18


các lớp và các MIDlet này sẽ được đóng gói trong cùng một file .jar khi triển
khai.


Hình 1.5: Ví dụ về MIDlet thứ nhất.

Hình 1.6 : Ví dụ về MIDlet thứ hai.
Đường liền thể hiện việc truy xuất Record store do MIDlet đó tạo ra, đường
nét đứt là Record store do MIDlet khác tạo ra. Trong MIDLET Suite One,
MIDlet #1 và MIDlet #2 cùng có thể truy xuất 4 Record store. MIDLET Suite
One không thể truy xuất Record store trong Suite Two. Trong MIDlet Suite One
tên của các Record store là duy nhấy, tuy nhiên Record store trong các MIDlet
Suite khác nhau có thể dùng chung một tên. Record Store còn có 2 thuộc tính là
Version Number và Date/time Stamp, các giá trị này thay đổi khi thực hiện
thêm, thay thế hay xóa một record, ngoài ra còn co thể dùng cơ chế event
handler (Listener) để phát hiện mỗi khi Record store bị thay đổi. Version
number là một số integer, để biết giá trị khởi đầu cần gọi hàm getVersion() sau
khi tạo một Record store. Date/time Stamp là số long integer, là số miliseconds
kể từ ngày 1 tháng 1 năm 1970, chúng ta có thể biết được giá trị này thông qua
hàm getLastModified().
19


b) Các vấn đề liên quan tới RMS


Hạn chế về khả năng lưu trữ của thiết bị di động
Dung lượng vùng nhớ (non-volatile memory) dành riêng cho việc lưu trữ

dữ liệu trong RMS thay đổi tùy theo thiết bị di động. Đặc tả MIDP yêu cầu rằng
các nhà sản xuất thiết bị di động phải dành ra vùng nhớ có kích thước ít nhất 8K
cho việc lưu trữ dữ liệu trong RMS. Đặc tả không nêu giới hạn trên cho mỗi
Record. RMS cung cấp các API để xác định kích thước của mỗi Record, tổng

dung lượng của RecordStore và kích thước còn lại của vùng nhớ này. Do đó
trong quá trình phát triển các ứng dụng J2ME lập trình viên phải cân nhắc trong
việc sử dụng vùng nhớ này.


Tốc độ truy xuất dữ liệu
Các thao tác trên vùng nhớ này (non-volatile memory) tất nhiên sẽ chậm

hơn nhiều khi truy xuất dữ liệu trên bộ nhớ RAM (volatile memory). Nó sẽ
giống như tốc độ đọc ổ cứng và tốc độ đọc từ RAM của máy tính. Vì vậy trong
kỹ thuật lập trình phải thường xuyên cache dữ liệu và các thao tác liên quan đến
RMS chỉ thực hiện tập trung một lần (lúc khởi động hay đóng ứng dụng).


Cớ chế luồng an toàn
Nếu RecordStore chỉ được sử dụng bởi một MIDlet thì không phải lo lắng

về vấn đề này vì RMS sẽ dành riêng một Thread để thực hiện các thao tác trên
RecordStore. Tuy nhiên, nếu có nhiều MIDlet và Thread cùng chia sẻ một
RecordStore thì phải chú ý đến kỹ thuật lập trình Thread để đảm bảo không có
sự xung đột dữ liệu.


Hàm API trong RMS. RecordStore không có hàm khởi tạo:
Lớp :RecordStoreClass:javax.microedition.rms.RecordStore
Phương thức

Mô tả

static RecordStore

openRecordStore(String

Mở một Recordstore, có tham số
tạo Record store nếu nó chưa tồn
tại.
20


recordStoreName, boolean
createIfNecessary)
void closeRecordStore()

ĐóngRecordStore.

static void
deleteRecordStore(String

Xóa RecordStore.

recordStoreName)
static String[]
listRecordStores()

Danh sách các Record Store trong
MIDletsuite.

int addRecord(byte[] data,int
offset,int numBytes)

Thêm một record vào Record

Store.

void setRecord(int recordId,
byte[] newData, int offset, int
numBytes)

Đặt hoặc thay thế một record trong
Record Store.

void deleteRecord(int recordId)

Xóa một record trong Record
Store.

byte[] getRecord(int recordId)

Lấy dãy byte chứa record.

int getRecord(int recordId,
byte[] buffer, int offset)

Lấy nội dung của record vào dãy
byte.

int getRecordSize(int recordId)

Kích thước record.

int getNextRecordID()


Lấy record id củarecord

int getNumRecords()

Số lượng các record.

long getLastModified()

Thời gian thay đồi gần nhất.

int getVersion()

Version của Record Store.

String getName()

Tên của Record Store.

int getSize()

Kích thước của Record Store.

int getSizeAvailable()

Số byte còn trống.

RecordEnumeration
enumerateRecords
RecordFilter filter,
RecordCompara


Xây dựng enumeration dùng để
duyệt Record Store.

comparator, boolean
keepUpdated)
void addRecordListener
(RecordListener listener)

Thêm phương thức lắng nghe cho
Record Store.

void removeRecordListener

Xóa phương thức lắng nghe
21


(RecordListener listener)
Bảng 1.3 : Bảng các record store không có hàm khởi tạo.


RecordEnumeration có duy trì một index của các record. Khi recordstore có
sự thay đổi thì RecordEnumeration có thể hoạt dộng không chính xác, do đó
chúng ta cần phải gọi hàm reindex() mỗi khi recordstore có sự thay đổi.

22





RecordEnumeration API:
RecordEnumeration Interface:
javax.microedition.rms.RecordEnumeration
Phương thức

Mô tả

int numRecords()

Số
lượng
enumeration

byte[] nextRecord()

Record tiếp theo.

int nextRecordId()

Record ID của record tiếp theo.

byte[] previousRecord()

Record trước đó.

int previousRecordId()

Record ID của record trước đó.


boolean hasNextElement()

Kiểm tra enumeration của record
kế tiếp.

boolean hasPreviousElement()

Kiểm tra enumeration của record
trước đó.

record

trong

void
keepUpdated(boolean Đặt enumeration reindex sau khi
keepUpdated)
có sự thay đổi.
boolean isKeptUpdated()

Kiểm tra enumeration có tự động
reindex()

void rebuild()

Tạo lại Index.

void reset()

Đưa enumeration về record đầu

tiên.
Giải phóng tài nguyên được sử
dụng bởi enumeration.

void destroy()

Bảng 1.4 : Bảng Record Enumeration API.

23




Tìm kiếm với bộ lọc RecoredFilter
Ngoài việc sắp xếp các record (sử dụng RecordComparator), enumerator

còn cung cấp cơ chế lọc (tìm kiếm các record thỏa mãn một điều kiện nào đó).
Khi sử dụng RecordComparator tất cả các record trong Record Store đều được
lưu trong một result set. Nhưng khi dùng RecordFilter, chỉ có những thỏa mãn
điều kiện mới có trong enumerator result set..


Các ngoại lệ phát sinh trong RMS
Các phương thức trong API của RMS ngoài việc phát sinh các ngoại lệ

thông thường đến môi trường chạy (runtime enviroment). RMS còn định nghĩa
thêm các ngoại lệ trong gói javax.microedition.rms như sau:
InvalidRecordIDException : Ngoại lệ này phát sinh ra khi không thể thao tác
trên Record vì RecordID không thích hợp.
 RecordStoreFullException: Ngoại lệ này phát sinh ra khi không còn đủ


vùng nhớ.
 RecordStoreNotFoundException: Ngoại lệ này phát sinh ra khi mở một
RecordStore không tồn tại.
 RecordStoreNotOpenException : Ngoại lệ này phát sinh ra khi thao tác
trên một RecordStore đã bị đóng.
 RecordStoreException: Đây là lớp cha của 4 lớp trên, ngoại lệ này mô tả

lỗi chung nhất trong quá trình thao tác với RMS.
1.2.6 Kết nối truyền thông
Trong phiên bản J2SE, hỗ trợ các giao thức kết nối mạng có các gói java.io
và java.net với tổng dung lượng hơn 200KB bao gồm hơn 100 lớp và giao diện.
Quả thật với bộ nhớ nhỏ bé và hạn chế trong xử lý, việc đưa những gói này vào
trong ứng dụng viết bằng J2ME là một điều hoàn toàn không khả thi. Chính vì
vậy, khi mở rộng phạm vi hỗ trợ giao thức mạng và hệ thống tập tin, người ta

24


không dùng lại các lớp của J2SE mà xây dựng một khái niệm mới được gọi là
khung kết nối chung (Generic Connection Framework - GCF). GCF là một tập
hợp các lớp và giao diện được thiết kế nhằm tọa thuận tiện cho việc truy xuất
đến các hệ thống lưu trữ và kết nối mạng. Mục tiêu của GCF không phải là tạo
ra một tập các lớp mới hoàn toàn mà nó cung cấp một tập con của J2SE một
cách có chọn lọc.
a)

Cây phân cấp
Khi đưa ra khái niệm cây phân cấp, người ta chủ ý tạo ra một lớp có khả


năng mở mọi loại kết nối bao gồm: file, http, datagram, ... Tên của lớp này là
Connector. Như vậy nếu sử dụng Connector để mở kết nối, chúng ta chỉ cần gọi
một phương thức open có định dạng như sau:
Connector.Open("protocol:address; parameter");
Cơ chế mà GCF dùng để mở nhiều loại giao tiếp chỉ bằng một phương thức
chung duy nhất này đã chứng minh tính uyển chuyển của GCF. Cơ chế này hoạt
động như sau:
Trong thời gian thực thi, mỗi khi có yêu cầu mở một giao thức, Connector
sẽ tìm đến lớp tương ứng cài đặt giao thức ấy. Quá trình tìm kiếm này được
thực hiện thông qua phương thức Class.forName(). Ví dụ như để yêu cầu mở
kết nối HTTP trong J2ME, yêu cầu đó sẽ được viết như sau:
Class.forName("com.sun.midp.io.j2me.http.Protocol");
Khi tìm thấy lớp tương ứng, Class.forName() sẽ trả về một đối tượng có cài
đặt giao diện Connection (trong đó lớp Connector và giao diện Connection đã
được định nghĩa sẵn trong CLDC). Sau đây là cây phân cấp Connection, nó bao
gồm các các lớp mà mỗi lớp được định nghĩa như là một giao diện:

25


×