1. Trang chủ
  2. » Luận Văn - Báo Cáo

Lập trình trò chơi lines cho điện thoại trên J2ME

56 334 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 56
Dung lượng 903,5 KB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

Bao gồm các kiến trúc nâng cao nh Web, EJB,Transaction,… dùng để xây dựng các ứng dụng có quy mô lớn + J2METM Java 2 Platform, Micro Edition: Bao gồm môi trờng và th viện Java dùng để p

Trang 1

Môc lôc

LÊI N I §ÇU Ã 2 CH¬NG I 4 TÆNG QUAN VÒ J2ME 4

1.1 G IÍI THI Ö U V Ò J AVA VÀ C « NG NGH Ö J2ME

4 1.2 K I Õ N TRÓC CÑA J2ME

9 1.3 § ÃNG GÃI VΜ TRI Ó N KHAI ØNG DÔNG

11 1.4 T ÈI U M · CH ¬ NG TR × NH VΜ GI ¶ M K Ý CH THÍC ØNG DÔNG

13

CH¬NG II 14 LËP TR×NH V I J2ME Í 14

2.1 MID LET VΜ ® ÈI TÎNG D ISPLAY

14 2.2 S CREEN ( GIAO DI ª N NGÊI DÏNG C Ê P CAO )

18 2.3 HÖ THÈNG QU ¶ N LÝ B ¶ N GHI (R ECORD M ANAGEMENT S YSTEM - RMS)

21

CH¬NG III 29 LËP TR×NH GAME B»NG J2ME 29

3.1 C¸ C HΜM API Ë MØC TH Ê P

29 3.2 L ÍP C ANVAS

29 3.3 L ÍP G RAPHICS

32 3.4 C¸ C GÃI HÇ TRÎ CHO L Ë P TR × NH GAME

45 4.3 X© Y DÙNG TRSS CH ¬ I L INES TR ª N J2ME.

48 4.4 KÕ T QU ¶ THU ® ÎC

51

Trang 2

LờI NóI ĐầU

Ngày nay công nghệ viễn thông đang có những bớc phát triển vô cùng tolớn Cùng với các ngành khoa học khác, công nghệ viễn thông đã đem đến chocon ngời những ứng dụng quan trọng trong tất cả các nghành, lĩnh vực đời sốngnh: kinh tế, giáo dục, y học, khoa học kỹ thuật…để thoả mãn nhu cầu ngày càngcao của con ngời

Song song cùng với sự phát triển của công nghệ viễn thông là sự pháttriển không ngừng về các công nghệ trên điện thoại di động và điện thoại di

động đang nhanh chóng trở thành một phần của cuộc sống Các thiết bị di độngngày càng hiện đại hơn, "thông minh" hơn và ngày càng có nhiều tính năng nổibật Chúng không chỉ đơn thuần đảm nhận chức năng hội thoại mà còn có thêmnhiều chức năng nh chụp ảnh, nghe nhạc, xem phim, chơi game nh một "trungtâm giải trí" Nhu cầu phát triển phần mềm cho các thiết bị di động ngày càngtăng cao và đợc đánh giá là một ngành công nghệ có thể đem lại nhiều lợinhuận Một thực tế đặt ra cho các nhà phát triển phần mềm trên các thiết bị này

là hiện nay không có một chuẩn hóa nào dành cho các nhà sản xuất phần cứng.Các thiết bị trên thị trờng hiện nay rất đa dạng và mang nhiều đặc điểm cũng

nh cấu hình khác nhau Trớc thực tế đó, việc có thể chạy trên nhiều môi trờng làmột lợi thế rất lớn của ngôn ngữ Java Các nhà phát triển Java đã cho ra đờingôn ngữ J2ME (Java 2 Micro Edition) hớng đến việc phát triển phần mềm chocác thiết bị di động Ngôn ngữ J2ME thực sự là một ngôn ngữ nhỏ gọn, dễ nắmbắt, chặt chẽ và thích hợp cho các thiết bị có khả năng hạn chế Các thiết bị di

động trên thị trờng hiện nay, đặc biệt là điện thoại di động hầu hết đều hỗ trợngôn ngữ J2ME và J2ME thực sự đã trở thành một trong những ngôn ngữ phổbiến nhất trong lãnh vực lập trình di động

Từ những yêu cầu thiết yếu đó tôi đã chọn đề tài đồ án tốt nghiệm của

mình là:" Lập trình trò chơi Lines cho điện thoại di động trên J2ME (Java 2

Platform, Micro Edition)".

Nội dung của đồ án bao gồm

Chơng I: "Tổng quan về J2ME" Chơng này tìm hiểu đợc sự ra đời, ý nghĩa hay

các khái niệm, định nghĩa, kiến trúc cơ bản, quan trọng trong J2ME và cách

đóng gói, triển khai ứng dụng của J2ME

Trang 3

Chơng II: "Lập trình với J2ME" Chơng này trình bày các kỹ năng chính khi lập

trình với J2ME (MIDlet, Dislay) Và làm quen với giao diện ngời dùng cấp cao

nh form, list, textbox Hay biết cách lu trữ kiểu bản ghi trong J2ME

Chơng III: "Lập trình Game bằng J2ME" Chơng này trình bày các th viện của

API trong J2ME để phát triển Game Nh các gói Canvas, Graphics, Layer,TiledLayer, Sprites,

Chơng IV: "Xây dựng chơng trình trò chơi Lines" Trình bày về tổng quan về

game, và ứng dụng trên bài toán cụ thể Cách giải quyết các vấn trong việc xâydựng trò chơi Lines trên J2ME và kết quả thu đợc

Trang 4

Chơng I tổng quan về J2ME

1.1 Giới thiệu về Java v công nghệ J2ME à

1.1.1 Giới thiệu về Java

Java là một công nghệ đợc hãng Sun Microsystems xây dựng từ cuối năm

1990 với cái tên Oak và hiện nay đang phát triển vợt bậc với sự đóng góp củahàng vạn lập trình viên trên thế giới Ban đầu, Oak đợc kỹ s James Gosling vàcác cộng sự xây dựng với mục đích lập trình cho các mặt hàng điện dân dụngvới mục tiêu nhỏ gọn và tơng thích đợc với nhiều loại thiết bị phần cứng khácnhau Sau đó Oak đợc sử dụng trong nhiều dự án nh dự án Xanh (Blue Project),

dự án Phim theo yêu cầu (Video on demand Project) Sau một chuyến du lịchtới đảo Java của Indonesia, nhóm phát triển Oak đã đổi tên Oak thành Java

Java mà tiền thân là Oak đợc xây dựng chủ yếu dựa trên bộ công cụ pháttriển (Java Development Kit - JDK) nh là bộ th viện chuẩn trong đó cha trìnhbiên dịch, trình thông dịch, trình đóng gói, tài liệu,… Đây chính là nền tảng choviệc phát triển các ứng dụng Java Hiện nay, cộng đồng Java trên thế giới mà đi

đầu là hãng Sun Microsystems đã xây dựng nhiều nhánh mới cho Java nh:JavaMail (th điện tử), Java TAPI (viễn thông), Java3D (đồ họa 3 chiều), J2ME(ứng dụng cho thiết bị di động),…

Hiện nay Java có các phiên bản sau:

+ J2SETM (Java 2 Platform, Standart Edition): Phiên bản chuẩn gồm bộ

công cụ thông dụng dùng để chạy trên các máy PC hoặc các mạng máytính nhỏ

+ J2EETM (Java 2 Platform, Enterprise Edition): Phiên bản dành cho các

máy chủ với bộ nhớ lớn Bao gồm các kiến trúc nâng cao nh Web, EJB,Transaction,… dùng để xây dựng các ứng dụng có quy mô lớn

+ J2METM (Java 2 Platform, Micro Edition): Bao gồm môi trờng và th viện

Java dùng để phát triển các ứng dụng trên các thiết bị có bộ nhớ nhỏ nh

điện thoại di động, PDA, các đồ gia dụng,…

1.1.2 Khái quát các lớp J2ME

J2ME đợc phát triển từ kiến trúc JavaCard, EmbededJava và PersonalJavacủa phiên bản Java 1.1 Đến khi ra đời phiên bản Java 2 thì Sun quyết định thay

Trang 5

thế PersonalJava bằng một phiên bản mới có tên Java 2 Micro Edition, viết tắt làJ2ME J2ME đợc sử dụng cho các thiết bị nhỏ gọn với dung lợng bộ nhớ bé vàkhả năng xử lý thấp

Mục tiêu của J2ME là cho phép ngời lập trình viết các ứng dụng độc lậpvới thiết bị di động, không cần quan tâm đến phần cứng thật sự Với mục tiêu

đó, J2ME đợc xây dựng bằng các tầng (layer) khác nhau để giấu đi việc thựchiện phần cứng khỏi nhà phát triển Các tầng của J2ME đợc xây dựng trênCLDC (Connected Limited Device Configuration - cấu hình thiết bị kết nối giớihạn) nh sau:

Hình 1.1 Các tầng của J2ME đợc xây dựng trên CLDC

+ Tầng Phần cứng thiết bị (Device Hardware Layer): Tầng này chỉ ra

thiết bị di động thật sự cùng với bộ nhớ và tốc độ xử lý cụ thể của nó Dĩnhiên đây không phải là một phần của J2ME nhng nó là điểm xuất phát

để phát triển các phần mềm ứng dụng trên thiết bị đó Các thiết bị di độngkhác nhau có thể có bộ vi xử lý và các tập lệnh rất khác nhau Mục tiêucủa J2ME là cung cấp cho lập trình viên khả năng giao tiếp giống nhauvới tất cả các loại thiết bị di động khác nhau

Hiện trạng MIDP – Mobile Information Device Profile

Trang 6

Hình 1.2 Quá trình xây dựng ứng dụng cho thiết bị di động sử dung KVM

+ Tầng máy ảo Java (Java Virtual Machine Layer): Đây là tầng đóng vai

trò thông ngôn giữa chơng trình và thiết bị Nó sẽ thông dịch các mãbytecode (mã có đợc sau khi biên dịch mã nguồn chơng trình) thành mãmáy của các thiết bị di động Tầng này sử dụng KVM (Kernel VirtualMachine - Máy ảo đợc thiết kế nhỏ gọn với mục tiêu tiết kiệm bộ nhớ) đểbiên dịch mã bytecode thành mã máy Chính KVM sẽ chuẩn hóa đầu racủa các chơng trình Java cho các thiết bị di động khác nhau có thể có bộ

vi xử lý và tập lệnh khác nhau Nó cung cấp một sự chuẩn hóa cho cácthiết bị di động để ứng dụng J2ME sau khi biên dịch có thể chạy đợc trênbất kỳ thiết bị di động nào hỗ trợ KVM Nh vậy, không có KVM các ch-

ơng trình Java phải đợc biên dịch thành tập lệnh cho mỗi thiết bị di động

v lập trình viên phải xây dựng nhiều đích cho mỗi loại thiết bị di động.à

+ Tầng cấu hình (Configuration Layer): Kế trên tầng KVM là CLDC

(Connected Limited Device Configuration: Cấu hình thiết bị kết nối giới

hạn) Mục đích của tầng này là cung cấp một tập tối thiểu các th viện chophép một ứng dụng Java chạy trên thiết bị di động Tầng này cung cấpcác hàm API cơ bản là nhân của J2ME Lập trình viên có thể sử dụng cáclớp và các phơng thức của các API này tuy nhiên nó không thực sự phongphú bằng tập API của tầng hiện trạng

+ Tầng hiện trạng (Profile Layer): Đây là tầng cao nhất của J2ME, tầng

này cung cấp các hàm API hữu dụng hơn cho việc lập trình Mục đích của

Trang 7

tầng này xây dựng nên lớp cấu hình và cung cấp nhiều th viện ứng dụnghơn Một thiết bị di động có thể hỗ trợ nhiều hiện trạng Một hiện trạng

có thể áp đặt thêm các giới hạn trên các loại thiết bị di động (nh nhiều bộnhớ hơn hay độ phân giải màn hình cao hơn) Hiện trạng là tập các APIhữu dụng hơn cho các ứng dụng cụ thể Lập trình viên có thể viết mộtứng dụng cho một hiện trạng cụ thể và không cần quan tâm đến nó chạytrên thiết bị nào Hiện tại hiện trạng đợc công bố là MIDP (MobileInformation DeviceProfile: Cấu hình thông tin thiết bị di động) với đặc tảJSR - 37 Có 22 công ty là thành viên của nhóm chuyên gia tạo ra chuẩnMIDP MIDP cung cấp các API cho phép thay đổi trạng thái chu kỳ sốngứng dụng, đồ họa (mức cao và mức thấp), tuyến đoạn, timer, lu trữ bềnvững (persistent storage), và mạng Những chức năng MIDP cung cấp:

o Có thể sử dụng phần lớn các lớp và kiểu dữ liệu quen thuộc vẫncò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 trong Java

o 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ểnthị dữ liệu trên màn hình điện thoại

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

o Nâng cấp các tính năng bảo mật: Download qua mạng an toàn hơnqua việc hỗ trợ giao thức HTTPS

o 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ủangời sử dụng

Trang 8

o Thêm các API hỗ trợ Multimedia Một trong nhng cải tiến hấp dẫnnhấ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).

o Mở rộng các tính năng của Form Nhiều cải tiến đã đợc đa vào APIjavax.microedition.lcdui trong MIDP 2.0, nhng các thay đổi lớnnhất (ngoài API cho game) là trong Form và Item

o 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 độngtrong 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 nhquản lý đồ họa Việc này sẽ làm tăng kích thớc file của sản phẩmcũ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 caocấp Với Game API nhà phát triển còn đợc cung cấp các tính năng

Tuy nhiên MIDP không thể thực hiện:

o Phép tính dấu phẩy động (floating point): Phép tính này đòi hỏi rấtnhiều tài nguyên CPU Phần lớn CPU dùng cho các thiết bị di độngkhông hỗ trợ phép tính này, do đó MIDP cũng không có

o Bộ nạp class (Class Loader)

o Hỗ trợ từ khóa finalize() nh trong J2SE: Việc 'dọn dẹp' tài nguyêntrớc khi xóa đợc đẩy về phía lập trình viên

o Hỗ trợ JNI (Java Native Interface - gọi các hàm đợc viết trongnhững ngôn ngữ khác từ Java.)

o Hỗ trợ thao tác bắt lỗi: Chỉ hỗ trợ hạn chế

Trang 9

o Th viện API cho Swing và AWT(Abstract Windowing Toolkit - bộcông cụ chứa các lớp để tạo cửa sổ): Phần lớn không thể sử dụngtrong MIDP.

o Hỗ trợ các tính năng quản lý file và th mục: Điều này có thể làmbạn ngạc nhiên nhng thực tế là các thiết bị J2ME không có hỗ trợcác thiết bị lu trữ thông thờng nh ổ cứng v.v Tuy nhiên, điều đókhông có nghĩa là bạn phải mất đi mọi dữ liệu quan trọng khi tắtmáy, Sun đã cung cấp một chức năng khác tơng đơng gọi là RecordManagement system (RMS) để lu trữ cho các thiết bị này

1.2 Kiến trúc của J2ME

Kiến trúc tổng quát của J2ME dựa trên nền tảng Java

Hình 1.3 Kiến trúc tổng quát của J2ME dựa trên nền tảng Java

Trong đó các thành phần chính của J2ME bao gồm Configuration và Profile

Trang 10

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ìnhgame cho điện thoại Samsung thì có thể sửa đổi chơng trình của mình một cáchtối thiểu nhất để có thể chạy trên điện thọai Nokia Hiện nay Sun đã đa ra 2dạ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ênCLDC đợc gắn với Java không dây (Java Wireless ), dạng nh cho phépngờ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 nhng 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 PDAcấ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 ứngdụng J2ME Tuy nhiên, 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 CLDCkhông đợc yêu cầu hỗ trợ kiểu float và double

Trang 11

b Profile:

Profile mở rộng Configuration bằng cách thêm vào các class để bổ trợ cáctính năng cho từng thiết bị chuyên biệt Do mỗi profile định nghĩa một tập hợpcác class khác nhau, nên thờng không thể chuyển một ứng dụng Java viết chomột profile này sang chạy trên một máy hỗ trợ một profile khác Với lý do đó,bạn 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áyhỗtrợ J2ME Sau đây là các profile tiêu biểu:

- Mobile Information Device Profile (MIDP: cấu hình thông tin thiêt bị

di động): 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ểnthị hạn chế, dung lợng chứa có hạn Do đó MIDP sẽ cung cấp một giaodiệ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ảncho lập trình Java trên các máy di động (Wireless Java)

- Personal Digital Assitant Profile (PDA Profile: thiết bị kỹ thuật số hỗ

trợ cá nhân): tơng tự MIDP, nhng với thị trờng là các máy PDA với màn

hình và bộ nhớ lớn hơn

- Foundation Profile: cho phép mở rộng các tính năng của CDC với phần

lớn các th viện của bộ Core Java2 1.3 ngoài ra còn có Personal BasisProfile, Personal Profile, RMI Profile, Game Profile

1.3 Đóng gói và triển khai ứng dụng

Mã nguồn chơng trình có thể đợc biên dịch bằng các trình biên dịchchuẩn của Java, chúng tạo ra các file.class Ta có thể biên dịch từ các trình soạnthảo hoặc biên dịch trực tiếp từ dòng lệnh

Quá trình biên dịch đợc thực hiện nh sau:

- Tập tin nguồn: Từ các các tập tin nguồn Java do lập trình viên tạo ra, có

thể có nhiều tập tin (*.java)

- Biên dịch Java trên IDE: bộ biên dịch Java (Java Compiler) biên dịch

mã nguồn thành mã bytecode Mã bytecode này sẽ đợc KVM dịch thànhmã máy Mã bytecode đã biên dịch sẽ đợc lu trong các tập tin *.class và

sẽ có một tập tin *.class sinh ra cho mỗi lớp Java

Trang 12

- Kiểm tra tính hợp lệ của mã bytecode trên IDE, bộ tiền kiểm tra sẽ kiểm

tra tính hợp lệ của mã bytecode Một trong những yêu cầu an toàn củaJ2ME là bảo đảm mã bytecode chuyển cho KVM là hợp lệ và không truyxuất các lớp hay bộ nhớ ngoài giới hạn của chúng Do đó tất cả các lớp

đều phải đợc tiền kiểm tra trớc khi chúng có thể đợc download về thiết bị

di động Việc tiền kiểm tra đợc xem là một phần của môi trờng phát triểnlàm cho KVM có thể đợc thu nhỏ hơn Bộ tiền kiểm tra sẽ gán nhãn lớpbằng một thuộc tính (attribute) đặc biệt chỉ rằng lớp đó đã đợc tiền kiểmtra Thuộc tính này tăng thêm khoảng 5% kích thớc của lớp và sẽ đợckiểm tra bởi bộ kiểm tra trên thiết bị di động

- Tạo tập tin JAR trên IDE: IDE sẽ tạo một tập tin JAR chứa:

o Tất cả các tập tin *.class

o Các hình ảnh của ứng dụng Hiện tại chỉ hỗ trợ tập tin *.png

o Các tập tin dữ liệu có thể đợc yêu cầu bởi ứng dụng

o Một tập tin kê khai (manifest.mf) cung cấp mô tả về ứng dụng cho bộquản lý ứng dụng (application manager) trên thiết bị di động

o Tập tin JAR đợc bán hoặc đợc phân phối đến ngời dùng đầu cuốiSau khi đã gỡ rối và kiểm tra mã lệnh trên trình giả lập (simulator), mãlệnh đã sẵn sàng đợc kiểm tra trên điện thoại di động và sau đó đợc phân phốicho ngời dùng

- Download ứng dụng về thiết bị di động: Ngời dùng cách để download

tập tin JAR chứa ứng dụng về thiết bị di động:

o Kết nối cáp dữ liệu từ PC sang cổng dữ liệu của điện thoại di động:Việc này yêu cầu ngời dùng phải có tập tin JAR thật sự và phần mềmtruyền thông để download ứng dụng sang thiết bị thông qua cáp dữliệu

o Cổng hồng ngoại IR (Infra Red) Port: Việc này yêu cầu ngời dùngphải có tập tin JAR thật sự và phần mềm truyền thông để downloadứng dụng sang thiết bị thông qua cổng hồng ngoại

o OTA (Over the Air): Sử dụng phơng thức này, ngời dùng phải biết địachỉ URL chỉ đến tập tin JAR

Trang 13

- Kiểm tra mã bytecode: bộ tiền kiểm tra kiểm tra tất cả các lớp đều có

một thuộc tính hợp lệ đã đợc thêm vào bởi bộ tiền kiểm tra trên trạm pháttriển ứng dụng Nếu tiến trình tiền kiểm tra thất bại thì ứng dụng sẽkhông đợc download về thiết bị di động

- Lu trữ chơng trình: bộ quản lý ứng dụng trên thiết bị di động sẽ lu trữ

chơng trình trên thiết bị di động Bộ quản lý ứng dụng cũng điều khiểntrạng thái của ứng dụng trong thời gian thực thi và có thể tạm dừng ứngdụng khi có cuộc gọi hoặc tin nhắn đến

- Thực thi ứng dụng: bộ quản lý ứng dụng sẽ chuyển ứng dụng cho KVM

để chạy trên thiết bị di động

o KVM: Thực thi mã bytecode khi chơng trình chạy

o KVM dịch mã bytecode sang ngôn ngữ máy của thiết bị di động đểchạy

1.4 Tối u mã chơng trình và giảm kích thớc ứng dụng

Sau khi đóng gói chơng trình thành tập tin JAR chúng ta thấy rằng cácfile dữ liệu đã đợc nén lại một cách đáng kể Tuy nhiên ta có thể giảm kích thớcfile JAR này thêm một lần nữa bằng cách dùng một công cụ Công cụ này th-ờng bao gồm các đặc tính sau:

bị đọc hơn vì các tên lớp, biến, hàm, package đã bị thay đổi Các công cụ thờng

đợc dùng để tối u mã chơng trình là Jbuilder 9X, Retroguard, Jshrink

Trang 14

Chơng II LậP TRìNH VớI J2ME

2.1 MIDlet và đối tợng Display

2.1.1 MIDlet

Nếu ngời nào đã viết Applet thì chắc hẳn thấy hai cái tên này na ná nhau.Thật vậy: MIDlet là viết tắt của “Mobile Information Device applet” Hầu hếtcá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 bạn 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à một bộ khung của MIDlet :

import javax.microedition.midlet.*;

public class MidletExample extends MIDlet {

public MidletExample(){}

public void startApp(){}

public void pauseApp(){}

public void destroyApp(boolean unconditional) {}

}

- import: dùng để nạp các lớp cần thiết từ th viện của CLDC và MIDP

- Dòng khai báo lớp: một lớp(class) test có thể đợc gọi từ bất kỳ lớp khác

(public), kế thừa (extends) từ lớp MIDlet (hay dễ hiểu hơn là: lớp test làmột MIDlet) và gọi thực thi (implements) các phơng thức của mộtinterface có tên là CommandListener

- Hàm khởi tạo (Constructor): Tạo ra một form, list, hay thêm các

Command vào hàm hoặc gắn sự kiện cho nó Hàm tạo chỉ đợc gọi mộtlần khi MIDlet khởi tạo lần đầu tiên, và chỉ đợc gọi lại khi đã thoát rakhỏi MIDlet, rồi khởi động lại

- startApp(): Phơng thức startApp() đợc gọi khi MIDlet đợc khởi tạo, và

mỗi khi MIDlet trở về từ trạng thái tạm dừng (pause) Các biến toàn cục

Trang 15

sẽ đợc khởi tạo lại trừ hàm tạo bởi vì các biến đã đợc giải phóng tronghàm pauseApp() Nếu không thì chúng sẽ không đợc khởi tạo lại bởi ứngdụng

- pauseApp(): Phơng thức pauseApp() đợc gọi mỗi khi ứng dụng cần đợc

tạm dừng (ví dụ, trong trờng hợp có cuộc gọi hoặc tin nhắn đến) Cáchthích hợp để sử dụng pauseApp() là giải phóng tài nguyên và các biến đểdành cho các chức năng khác trong điện thoại trong khi MIDlet đợc tạmdừng Cần chú ý rằng khi nhận cuộc gọi đến, hệ điều hành trên điện thoại

di động có thể dừng KVM thay vì dừng MIDlet Việc này do nhà sản xuấtthiết bị quyết định sẽ chọn cách nào

- destroyApp(boolean un): Phơng thức destroyApp() đợc gọi khi thoát

MIDlet trớc đó phải dải phóng hoàn toàn bộ nhớ đợc lấy bởi MIDlet (ví

dụ khi nhấn nút exit trong ứng dụng) Nó chỉ đơn thuần là thoát MIDlet.Phơng thức destroyApp() chỉ nhận một tham số Boolean Nếu tham sốnày là true, MIDlet đợc tắt vô điều kiện Nếu tham số là false, MIDlet cóthêm tùy chọn từ chối thoát bằng cách ném ra một ngoại lệMIDletStateChangeException

Ngoài các hàm đợc thực thi tự động bởi bộ quản lý ứng dụng mà ngờidùng không can thiệp đợc, MIDlet còn có những hàm cho phép ngời dùng gọitrực tiếp trong mã lệnh để điều khiển quá trình thực thi của MIDlet:

- notifyDestroyed(): nếu ngời dùng gọi hàm này trong mã lệnh của mình

thì có nghĩa là ngời dùng muốn ra lệnh cho bộ quản lý ứng dụng hãy

đóng MIDlet Hàm này có chức năng gần giống nh hàm exit trong C++hay C#: gọi ra để shutdown ứng dụng

- notifyPaused(): Nếu ứng dụng đang trong trạng thái hoạt động bình

th-ờng mà ngời dùng gọi hàm này thì ứng dụng sẽ bị chuyển sang trạng tháitạm ngừng (Paused) bởi bộ quản lý ứng dụng

- resumeRequest(): Ngợc lại của hàm notifyPaused() Nếu ứng dụng đang

trong trạng thái tạm ngng mà ngời dùng gọi hàm này thì ứng dụng sẽquay trở về trạng thái hoạt động

Vòng đời của một MIDlet từ lúc đợc nạp tới lúc thoát:

Trang 16

Hình 2.1 Vòng đời của một MIDletKhi ở trạng thái tạm dừng, ứng dụng MIDlet sẽ đợi chuyển sang trạngthái kích hoạt Khi ở trạng thái này thì ứng dụng của bạn nên giải phóng bớt cáctài nguyên hệ thống Khi khởi động chơng trình thì ứng dụng của bạn sẽ ở trạngthái tạm dừng này trớc khi chuyển sang trạng thái kích hoạt

Đôi khi ứng dụng của ngời dùng phải chuyển sang trạng thái tạm dừng đểthiết bị xử lý một số chức năng nào đó, ví dụ nh việc nhận một cuộc điện thoạigọi tới Để chuyển ứng dụng sang trạng thái tạm dừng thì phần mềm quản lýcác ứng dụng MIDlet sẽ gọi phơng thức pauseApp() Ngoài ra nếu ngời dùngmuốn tạm dừng ứng dụng của mình, ngời dùng có thể gọi phơng thứcnotifyPaused() Một cách cuối để chuyển sang trạng thái tạm dừng này là khiphơng thức startApp() đợc gọi nhng lại ném ra một lỗi ngoại lệ làMIDletStateChangeException

Khi ứng dụng chuyển sang trạng thái kích hoạt, nó có thể thực hiện cácchức năng của nó, sử dụng các tài nguyên bộ nhớ và khả năng xử lý của thiết bị.Một ứng dụng chuyển sang trạng thái kích hoạt khi phần mềm quản lý các ứngdụng MIDlet gọi phơng thức startApp() khi ứng dụng đang ở trạng thái tạmdừng Nếu ứng dụng của bạn đang ở trạng thái tạm dừng và bạn muốn chuyểnsang trạng thái kích hoạt, bạn có thể gọi phơng thức resumeRequest() Phầnmềm quản lý các ứng dụng MIDlet có thể bỏ qua yêu cầu này hoặc đa vào hàng

đợi nếu có nhiều ứng dụng cùng yêu cầu đợc chuyển sang trạng thái kích hoạt

Trang 17

Một ứng dụng sẽ chuyển sang trạng thái kết thúc khi phơng thứcdestroyApp(boolean unconditional) đợc gọi thành công khi ứng dụng đang ởtrạng thái kích hoạt hay tạm dừng Khi phần mềm quản lý các ứng dụng MIDletmuốn kết thức ứng dụng MIDlet, nó sẽ gọi phơng thức này để ứng dụng có thể

lu các thông số trạng thái và giải phóng tài nguyên hệ thống Bạn có thể chuyểnứng dụng của bạn sang trạng thái kết thúc bằng cách gọi phơng thứcnotifyDestroyed(), bạn chú ý là trớc khi gọi phơng thức này thì ứng dụng củabạn cần giải phóng tất cả tài nguyên vì phơng thức destroyApp(booleanunconditional) sẽ không đợc gọi

Vậy chuyện gì sẽ xảy ra khi ứng dụng của bạn đang xử lý một thao tácquan trọng nào đó và phơng thức destroyApp(boolean unconditional) đợc gọi?

Điều này tuỳ thuộc vào giá trị của biến unconditional truyền vào Nếu biến này

có giá trị là true (đúng) thì ứng dụng của bạn sẽ chắc chắn bị kết thúc mà phầnmềm quản lý các ứng dụng MIDlet không cần biết ứng dụng của bạn đang làmgì Tuy nhiên nếu biến unconditional này có giá trị false (sai) thì có nghĩa làphần mềm quản lý các ứng dụng MIDlet muốn kết thúc ứng dụng của bạn, nhngnếu ứng dụng của bạn đang xử lý một công việc quan trọng, bạn có thể ném rangoại lệ MIDletStateChangeException để thông báo phần mềm quản lý các ứngdụng MIDlet rằng ứng dụng cha muốn kết thúc

Tuy nhiên việc này cũng có thể tuỳ thuộc vào đời điện thoại cụ thể, ví dụ

nh có thể phần mềm quản lý các ứng dụng MIDlet vẫn kết thúc ứng dụng hoặc

nó sẽ gọi destroyApp(boolean unconditional) sau đó Các bạn cũng chú ý là khiứng dụng chuyển sang trạng thái kết thúc có nghĩa là ứng dụng sẽ đợc giảiphóng khỏi bộ nhớ nhng ứng dụng vẫn nằm trong điện thoại di động và bạn vẫn

có thể tiếp tục chạy nó những lần sau (trừ khi bạn gỡ bỏ ứng dụng của bạn rakhỏi điện thoại di động)

2.1.2 Đối tợng Display, Displayable và Screens

a Display:

Một ứng dụng MIDlet chỉ có duy nhất một đối tợng Display Đối tợngDisplay này dùng để lấy thông tin về màn hình cũng nh một số phơng thức cầncho 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

Trang 18

phù hợp để hiển thị chúng Đối tợng Display cần thiết cho bộ quản lý việc trìnhbày trên thiết bị điều khiển thành phần nào sẽ đợc hiển thị lên trên thiết bị

b Displayable:

Mặc dù chỉ có một đối tợng Display ứng với mỗi MIDlet, nhng nhiều đốitợng trong một MIDlet có thể đợc hiển thị ra trên thiết bị nh Forms, TextBoxes,ChoiceGroups, Đó chính là đối tợng Displayable (là một thành phần đợc hiểnthị trên một thiết bị) Vậy đối tợng Displayable là đối tợng có thể nhìn thấy đợcmột cách trực quan trên màn hình MIDP chứa 2 lớp con của lớp Displayable làScreen và Canvas

2.2 Screen (giao diên ngời dùng cấp cao)

Một đối tợng Screen không phải là một cái gì đó hiện ra trên thiết bị, màlớp Screen này sẽ đợc thừa kế bởi các thành phần hiển thị ở mức cao, chính cácthành phần này sẽ đợc hiển thị ra trên màn hình Hình dới đây sẽ mô tả mốiquan hệ của lớp Screen và các thành phần thể hiện ở mức cao

Hình 2.2 Mô tả mối quan hệ của lớp Screen và các thành phần thể hiện ở mức

cao

2.2.1 Thành phần Form và Items

Trong phần này sẽ giới thiệu các thành phần đợc hiển thị ra trên mộtForm Một Form chỉ đơn giản là một khung chứa các thành phần, mà mỗi thành

Trang 19

phần đợc thừa kế từ lớp Item Chúng ta sẽ xem qua các thành phần hiển thị trênthiết bị:

a TextField:

Một thành phần TextField thì tơng tự nh bất kỳ các đối tợng nhập văn bản tiêubiểu nào Ta có thể chỉ định một nhãn, số ký tự tối đa đợc phép nhập, và loại dữliệu đợc phép nhập Ngoài ra TextField còn cho phép ta nhập vào mật khẩu vớicác ký tự nhập vào sẽ đợc che bởi các ký tự mặt nạ

b DateField:

Thành phần DateField cung cấp một phơng tiện trực quan để thao tác đối tợngDate đợc định nghĩa trong java.util.Date Khi tạo một đối tợng DateField, ta cầnchỉ rõ là ngời dùng chỉ có thể chỉnh sửa ngày, chỉnh sửa giờ hay đồng thời cảhai

g CustomItem:

Trang 20

Thành phần CustomItem cho phép ta có thể tạo ra những thành phần Item củachính mình Những thành phần này cũng giống nh những Item khác là cũng cóthể đợc đặt vào trong Form và có thể nhận biết và xử lý sự kiện CustomItem đợc

vẽ lên màn hình hiển thị bằng phơng thức paint() Vì thế nó sẽ tùy thuộc vào

đoạn mã đợc ta hiện thực bên trong phơng thức paint() Quá trình tạo ra một đốitợng CustomItem cũng không khác các đối tợng có sẵn trên nền Java

h Image and ImageItem:

Hai lớp đợc dùng để hiển thị hình ảnh là: Image và ImageItem Image đợc dùng

để tạo ra một đối tợng hình ảnh và giữ thông tin nh là chiều cao và chiều rộng,

và dù ảnh có biến đổi hay không

2.2.2 Thành phần List, Textbox, Alert, và Ticker

Trong phần này chúng ta sẽ xem xét các đối tợng ListBox, TextBox, Alert, vàTicker trong các thành phần giao diện cấp cao của ứng dụng MIDP Chúng tahãy cũng xem lại cây phân cấp các thành phần trình bày trên thiết bị một cáchhoàn chỉnh hơn

a List:

List dùng để hiển thị các danh sách các khả năng cho ngời dùng lựa chọn Listgồm 3 dạng:

- Multiple: cho phép ngời dùng lựa chọn nhiều khả năng

- Exclusive: cho phép ngời dùng lựa chọn duy nhất một khả năng

- Implicit: chỉ hiển thị danh sách các khả năng lựa chọn dạng menu

Dạng thứ 3 là là dạng không tờng minh Các List không tờng minh đợc dùng đểthể hiện một thực đơn các chọn lựa

b TextBox:

TextBox đợc dùng để cho phép nhập nhiều dòng Thành phần TextBox vàTextField có những ràng buộc giống nhau trong việc chỉ định loại nội dung đợcphép nhập vào

c Alert và AlertType:

Một Alert đơn giản là một hộp thoại rất nhỏ thông báo cho ngời dùng biết

có một sự kiện xảy ra Có 2 loại Alert:

- Modal: là loại hộp thoại thông báo đợc trình bày cho đến khi ngời dùng

ấn nút đồng ý

Trang 21

- Non-modal: là loại hộp thoại thông báo chỉ đợc trình bày trong một sốgiây nhất định.

d Ticker:

Thành phần Ticker đợc dùng để thể hiện một đoạn chuỗi chạy theo chiềungang Tham số duy nhất của thành phần Ticker là đoạn văn bản đợc trình bày.Tốc độ và chiều cuốn đợc xác định bởi việc cài đặt trên thiết bị nào

2.3 Hệ thống quản lý bản ghi (Record Management System - RMS)

MIDP không sử dụng hệ thống file để lu 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 ll-u trữ gọi là RecordManagement System (RMS)

2.3.1 Lu trữ cố định thông qua Record Store

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ộtRecord là một chuỗi (mảng) các byte Nếu ta mã hoá dữ liệu của mình dới dạngnhị phân (binary), ta có thể lu 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 nókhông đợc vợt quá giới hạn qui định của thiết bị di động RMS lu 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 danhduy nhất

Một cơ sở dữ liệu kiểu bản ghi

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

Trang 22

vào một RecordStore nào đó, các thao tác trên Record phải thông quaRecordStore chứa nó Khi tạo ra một Record trong RecordStore, Record đợcgá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ầnchú rằng Record ID không phải là chỉ mục (index), các thao tác xóa Recordtrong RecordStore sẽ không tự động việc tính toán lại các Record ID của cácRecord hiện có và cũng nh không làm thay đổi Record ID của các Record đợctạo mới, ví dụ: khi ta xóa record id 3 khi thêm một record mới sẽ có id là 4 Nhvậy, các bản ghi đợc định danh bằng một số ID bản ghi (record ID) duy nhất.Các số sẽ không đợc dùng lại khi một bản ghi bị xóa do đó sẽ tồn tại cáckhoảng trống trong các ID bản ghi Data là một dãy các byte đại diện cho dữliệu cần lu

Nh trong hình 2.3, các MIDlet có thể có nhiều hơn một tập lu trữ bản ghi,chúng chỉ có thể truy xuất dữ liệu lu trữ bản ghi chứa trong bộ MIDlet củachúng Do đó, MIDlet 1 và MIDlet 2 có thể truy xuất dữ liệu trong Record Store

1 và Record Store 2 nhng chúng không thể truy xuất dữ liệu trong RecordStore3 Ngợc lại, MIDlet 3 chỉ có thể truy xuất dữ liệu trong Record Store 3 vàkhông thể truy xuất dữ liệu dữ liệu trong Record Store 1 và Record Store 2 Têncủa các lu trữ bản ghi phải là duy nhất trong một bộ MIDlet nhng các bộ khácnhau có thể dùng trùng tên Các bản ghi trong một lu trữ bản ghi đợc sắp xếpthành các mảng byte Các mảng byte không có cùng chiều dài và mỗi mảngbyte đợc gán một số ID bản ghi

Trang 23

Hình 2.3 Minh họa dữ liệu lu trữ bản ghi với MIDletRecord 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 có thể dùng cơ chế event handler (Listener) để phát hiện mỗi khi Recordstore bị thay đổi Version number là một số integer, để biết giá trị khởi đầu cầngọi hàm getVersion() sau khi tạo một Record store Date/time Stamp là số longinteger, 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()

2.3.2 Các hàm API trong RMS

RecordStore không có hàm khởi tạo

RecordStore Class: javax.microedition.rms.RecordStore

static RecordStore openRecordStore

(String recordStoreName, boolean

createIfNecessary)

Mở một Recordstore, có tham số tạoRecord store nếu nó cha tồn tại recordStoreName: tên của Record

Bộ MIDlet Bộ MIDlet khác

L u trữ

bản ghi 1 L u trữ bản ghi 2 L u trữ bản ghi 3

Trang 24

StorecreateIfNecessary: tham số tạo, nếutrue thì tạo mới recordStore, nếufalse không tạo mới

void closeRecordStore() Đóng Record Store

static void deleteRecordStore(String

static String[] listRecordStores() Danh sách các RecordStore trong

MIDlet suite

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

numBytes)

Thêm một record có dữ liệu là mảngdata[] đợc thêm vào từ phần tử thứ(int offset) đến phần tử thứ (intnumBytes) vào RecordStore

void setRecord(int recordId, byte[]

newData, int offset, int numBytes)

Đặt hoặc thay thế một record có chỉ

số là recordId trong RecordStorebằng mảng newData[]

void deleteRecord(int recordId) Xóa một record có chỉ số là recordId

trong RecordStore

byte[] getRecord(int recordId) Lấy mảng byte chứa record

int getRecord(int recordId, byte[] buffer,

int offset)

Lấy nội dung của RecordStore tạirecordId vào dãy byte buffer bắt đầutại vị trí offset của dãy đó

int getRecordSize(int recordId) Kích thớc của một record

int getNextRecordID() Lấy record id của record mới

int getNumRecords() Số lợng các record

long getLastModified() Thời gian thay đổi gần nhất

String getName() Tên của RecordStore

int getSize() Kích thớc của RecordStore

int getSizeAvailable() Số byte trống cho RecordStore

RecordEnumeration

enumerateRecords( RecordFilter filter,

RecordComparator comparator, boolean

keepUpdated)

Xây dựng enumeration dùng đểduyệt recordstore

void addRecordListener (RecordListener

void removeRecordListener

(RecordListener listener) Remove listener

2.3.3 Mở (open), Định dạng (Format), Thêm (Add), Đọc(Read) và Xóa (Delete) các bản ghi

a Hàm để mở một recordstore:

public void openRecStore() {

try {

Trang 25

// Create record store if it does not exist

Sau đây là ví dụ của việc định dạng dữ liệu bản ghi, mở một lu trữ bảnghi và sau đó thêm dữ liệu bản ghi vào lu trữ bản ghi

ByteArrayOutputStream baos = new ByteArrayOutputStream();

DataOutputStream outputStream = new DataOutputStream(baos);

outputStream.writeByte( T ); // byte [0] Thẻ chỉ loại bản ghi‘ ’

outputStream.writeInt(score); // byte [1] đến [4]

outputStream.writeUTF(name); // byte [5] đến (5 + name.length)

byte[] theRecord = boas.toByteArray();

recordStore rs = null;

rs = RecordStore.openRecordStore( RecordStoreName ,“ ”

CreateIfNoExist);

int RecordID = rs.addRecord(theRecord, 0, theRecord.length);

Hình 2.4 Bản ghi thu đợc qua việc định dạng và thêm dữ liệu

+) Định dạng dữ liệu bản ghi:

Record ID ''T' T' Byte Byte Byte Byte Byte Byte Byte

Record ID ''T' T' Byte Byte Byte Byte Byte Byte Byte

Record ID ''S' S' Byte Byte Byte Byte Byte Byte Byte

Record ID ''S' S' Byte Byte Byte Byte Byte Byte Byte

Trang 26

Trong ví dụ trên, hai dòng đầu tạo một luồng xuất để giữ dữ liệu bản ghi.

Sử dụng đối tợng DataOutputStream (bọc mảng byte) cho phép các bản ghi dễdàng đợc định dạng theo các kiểu chuẩn của Java (long, int, string,…) mà khôngphải quan tâm đến tách nó thành dữ liệu byte Phơng thức writeByte(),writeInt(), và writeUTF() định dạng dữ liệu nh trong hình 2.5 (tag, intscore,string name) Sử dụng thẻ (tag) làm byte đầu tiên có ích để xác định loạibản ghi sau này Phơng thức toByteArray() sao chép dữ liệu trong luồng xuấtthành một mảng byte chứa bản ghi để lu trữ Biến theRecord là tham chiếu đếndữ liệu đã định dạng

+) Thêm dữ liệu bản ghi đã định dạng vào lu trữ bản ghi:

Khi dữ liệu đã đợc định dạng, nó có thể đợc thêm vào lu trữ bản ghi bằngcách sử dụng hai phơng thức: Phơng thức openRecordStore() tạo và mở một lutrữ bản ghi với tên là RecordStoreName Và phơng thức addRecord() thêm bảnkhi (bắt đầu bằng byte 0 của Record và IdRecord = 1 ) và trả về ID bản ghi gắnvới record này

c Đọc bản ghi:

Đọc bản ghi cũng giống nh thêm bản ghi nó gồm hai bớc: Bớc đầu tiên là

định dạng bản ghi theo định dạng mà ta đã định dạng ở thêm bản ghi và bớc tiếptheo là đọc bản ghi theo tuần tự đã định dạng

Sau đây là ví dụ của việc đọc bản ghi đã đợc định dạng trớc:

byte[] recData = new byte[50];

ByteArrayInputStream(recData);

DataInputStream strmDataType = new DataInputStream(strmBytes);

if (rs.getNumRecords() > 0) {

// đọc ra các dạng dữ liệu đã định dạng strmDataType.readUTF()); strmDataType.readBoolean());

strmDataType.readInt());

strmBytes.reset();

comp.compareIntClose(); // Free enumerator re.destroy();

strmBytes.close(); strmDataType.close();

Nếu chỉ cần đọc ghi những đoạn text vào record, thì ta không cần phải

định dạng Tuy nhiên, thực tế là ta cần lu những giá trị khác: String, int,boolean, v.v… Trong trờng hợp này, chúng ta cần sử dụng stream để đọc và ghirecord Việc sử dụng stream giúp chúng ta linh động và nâng cao hiệu quả củaviệc đọc và ghi dữ liệu vào RecordStore Chúng ta sử dụng nextRecord() để

Trang 27

duyệt đến record sau đó, ngoài ra còn có previousRecord() giúp duyệt về recordtrớc đó Nếu muốn bắt đầu tại vị trí cuối cùng của recordstore ta chỉ cần gọihàm previousRecord() ngay khi mở recordstore, nó sẽ trả về dòng cuối cùng RecordEnumeration có duy trì một index của các record Khi recordstore có sựthay đổi thì RecordEnumeration có thể hoạt độ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

d Xóa bản ghi:

Bản ghi đợc xóa bằng cách chuyển số ID bản ghi cho phơng thứcdeleteRecord() của đối tợng RecordStore Ví dụ, bản ghi 7 bị xóa bằng phơngthức deleteRecord(), nếu một bản ghi khác đợc thêm vào thì số ID bản ghi sẽ là

- EQUIVALENT: Hai bản khi đợc xem là giống nhau

- FOLLOWS: Bản ghi đầu tiên có thứ tự theo sau bản khi thứ hai

- PRECEDES: Bản ghi đầu tiên có thứ tự đứng trớc bản ghi thứ hai

Khi sắp xếp record theo số nguyên ta cần phải đọc do đó trớc hết ta phảilấy dữ liệu trong dãy byte Tuy nhiên, có một lu ý là do dữ liệu ta cần lấy nằmcuối cùng trong dãy byte do đó ra cần phải đọc theo thứ tự, tức là phải đọc kiểuString, boolean, trớc nó Hầu hết, thứ tự sắp xếp của toàn bộ bản ghi sẽ đợc xác

định bởi giá trị của các số nguyên Do dữ liệu lu vào không còn là dạng text, vàhàm String CompareTo() trên nội dung của record không thể sắp xếp dữ liệutheo mong muốn

b Lọc các bản ghi (Filtering Records):

Ngoài việc sắp xếp các record (sử dụng RecordComparator), enumeratorcòn cung cấp cơ chế lọc lọc các bản ghi theo tiêu chuẩn của lập trình viên Lọc

Trang 28

của bản ghi đợc dùng trong 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 RecordStore đều đợc lutrong một result set Nhng khi dùng RecordFilter, chỉ có những thỏa mãn điềukiện mới có trong enumerator result set Giao diện RecordFilter có phơng thứcmatches() dùng để xác định tiêu chuẩn phù hợp Phơng thức matches() có mộttham số đầu vào là mảng byte biểu diễn một bản ghi Phơng thức phải trả vềtrue nếu bản ghi này phù hợp với tiêu chuẩn đã định nghĩa

2.3.5 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 ờng đến môi trờng chạy (runtime enviroment) RMS còn định nghĩa thêm cácngoại lệ trong gói javax.microedition.rms nh sau:

th-+ InvalidRecordIDException: Ngoại lệ này phát sinh ra khi không thể thaotá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ộtRecordStore không tồn tại

+ RecordStoreNotOpenException: Ngoại lệ này phát sinh ra khi thao táctrê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

Ngày đăng: 15/12/2015, 12:41

TỪ KHÓA LIÊN QUAN

TRÍCH ĐOẠN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

🧩 Sản phẩm bạn có thể quan tâm

w