Đồ án J2ME và lập trình Game trên điện thoại di động

Mặc dù hạn chế về bộ nhớ và khả năng xử lý nhưng thiết bị di động vẫn hỗ trợ hệ thống xử lý file và các giao thức kết nối mạng. Với kích thước hơn 200 kb và hơn 100 class và interfaces trong gói java.io, java.net của J2SE sẽ chiếm hầu hết bộ nhớ nhỏ bé của những thiết bị đi động. Do đó Sun không thể kế thừa những gói này vào trong J2ME, mà đã xây dựng một chuẩn là Generic Connection Framework (GCF). GCF sẽ giúp cho các thiết bị di động có thể truy xuất được các tài nguyên mạng, cũng như các tài nguyên khác mà địa chỉ của chúng được xác định bằng URL.

Generic Connection Framework bao gồm một tập hợp các interfaces được khai báo trong package javax.microedition.io.

 

doc59 trang | Chia sẻ: maiphuongdc | Lượt xem: 1743 | Lượt tải: 1download
Bạn đang xem trước 20 trang tài liệu Đồ án J2ME và lập trình Game trên điện thoại di động, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
n của chính nó. Trong J2ME, các hành động nói chung được thể hiện dưới dạng các nút trên thiết bị Nếu có quá nhiều hành động được hiển thị trên thiết bị, thiết bị sẽ tạo ra một thực đơn để chứa các hành động Chỉ có các thành phần MIDP sau đây mới có thể chứa các đối tượng Command là: Form, TextBox, List và Canvas. Các bước cơ bản để xử lý các sự kiện với một đối tượng Command: Tạo một đối tượng Command Đặt đối tượng Command lên trên một đối tượng Form, TextBox, List, hay Canvas Tạo một bộ lắng nghe Khi có một sự kiện xảy ra, bộ lắng nghe sẽ phát sinh một lời gọi đến phương thức commandAction(). Trong thân phương thức này bạn có thể xác định đối tượng nào phát sinh ra sự kiện và tạo ra các xử lý tương ứng Dưới đây là đoạn mã minh họa việc tạo ra sự kiện Command và xử lý sự kiện: private Form fmMain; private Command cmExit; ... fmMain = new Form("Core J2ME"); cmExit = new Command("Exit", Command.EXIT, 1); ... fmMain.addCommand(cmExit); fmMain.setCommandListener(this); ... public void commandAction(Command c, Displayable s) { if (c == cmExit) { destroyApp(true); notifyDestroyed(); } } 2.7.2 Đối tượng Item Ngoài việc xử lý sự kiện bằng đối tượng Command ta có thể xử lý sự kiện bằng đối tượng Item. Nhiều đối tượng trong MIDP đã được định nghĩa trước cho việc xử lý các sự kiện cụ thể nào đó. Ví dụ đối tượng DateField cho phép người sử dụng chọn lựa ngày và giờ trên màn hình, đối tượng TextField cho phép người dùng nhập vào một chuỗi các ký tự, số và các ký tự đặc biệt Tương tự như việc xử lý sự kiện bằng đối tượng Command, thì khi có một thay đổi xảy ra đối với bất kỳ thành phần Item nào thì phương thức itemStateChanged() sẽ được gọi. Và chúng ta sẽ thực hiện các xử lý bên trong phương thức này Dưới đây là đoạn mã minh họa việc tạo ra sự kiện Command và xử lý sự kiện: private Form fmMain; private DateField dfToday; fmMain = new Form("Core J2ME"); dfToday = new DateField("Today:", DateField.DATE); fmMain.append(dfToday); fmMain.setItemStateListener(this); public void itemStateChanged(Item item) {if (item == dfToday) Chương 3 CÁC THÀNH PHẦN GIAO DIỆN Ở MỨC THẤP 3.1 Các hàm API ở mức thấp Mặc dù các hàm API cấp cao cung cấp một tập đầy đủ các thành phần để xây dựng giao diện ứng dụng người dùng. Tuy nhiên các thành phần cấp cao không cung cấp phương tiện để vẽ trực tiếp lên thiết bị thể hiện. Vì thiếu khả năng này nên các ứng dụng được tạo ra sẽ gặp nhiều giới hạn. Ví dụ hầu hết các nhà phát triển Game di động dựa trên khả năng vẽ các đường thẳng và các hình dạng như là một phần tích hợp quá trình phát triển. Nếu các hàm API cấp cao cho phép chúng ta tạo ra giao diện cho các ứng dụng theo chuẩn, thì các hàm API cấp thấp cho phép chúng ta có thể thể hiện các ý tưởng của mình. 3.2 Lớp Canvas Lớp Canvas cung cấp một khung vẽ cho phép tạo ra giao diện tùy biến người dùng. Một số lượng lớn các phương thức trong lớp này được dùng để xử lý sự kiện, vẽ ảnh và chuỗi lên thiết bị hiển thị. Hai lớp chính sử dụng ở mức API cấp thấp là Canvas và lớp đối tượng đồ họa Graphics. Canvas là nơi để vẽ, được hình dung là một tấm vải có chiều rộng và chiều cao, với những gì vẽ lên đó đều sẽ hiển thị ra bên ngoài. Lớp Canvas cũng cung cấp những phương thức để xử lý sự kiện mức thấp. Ta dùng đối tượng Graphics (được gọi là ngữ cảnh đồ họa Graphics) để vẽ lên Canvas. Lớp này có những phương thức để vẽ đường thẳng, hình cung, hình chữ nhật, văn bản… 3.2.1 Hệ thống trục tọa độ Hệ thống tọa độ cho lớp Canvas có tâm tọa độ là điểm trái trên của thiết bị trình bày. Giá trị x tăng dần về phía phải, giá trị y tăng dần khi đi xuống phía dưới. 3.2.2 Tạo một đối tượng Canvas Bước đầu tiên để làm việc với một lớp Canvas là tạo ra một lớp thừa kế từ lớp Canvas class TestCanvas extends Canvas implements CommandListener { private Command cmdExit; ... display = Display.getDisplay(this); cmdExit = new Command("Exit", Command.EXIT, 1); addCommand(cmdExit); setCommandListener(this); ... protected void paint(Graphics g) { // Draw onto the canvas } 3.3 Sự kiện hành động Cũng như các thành phần Form, List, và TextBox, một Canvas có thể xử lý các sự Command. Chúng ta có thể xử lý các sự kiện Command trên thành phần Canvas cung cách như các thành phần khác Đoạn mã sau minh họa việc xử lý sự kiện Command trên thành phần Canvas class TestCanvas extends Canvas implements CommandListener { private Command cmdExit; ... display = Display.getDisplay(this); cmdExit = new Command("Exit", Command.EXIT, 1); addCommand(cmdExit); setCommandListener(this); ... protected void paint(Graphics g) { // Draw onto the canvas ... } public void commandAction(Command c, Displayable d) { if (c == cmdExit) ... } 3.4 Mã phím Trong trường hợp xử lý các hành động của các phím mềm, một Canvas có thể truy cập đến 12 mã phím. Những mã này được đảm bảo luôn luôn có trên bất kỳ các thiết bị MIDP nào KEY_NUM0 KEY_NUM1 KEY_NUM2 KEY_NUM3 KEY_NUM4 KEY_NUM5 KEY_NUM6 KEY_NUM7 KEY_NUM8 KEY_NUM9 KEY_STAR KEY_POUND Bốn phương thức để xử lý các mã phím là: void keyPressed(int keyCode): Gọi khi một phím bị nhấn lần đầu. void keyReleased(int keyCode): Gọi khi một phím được thả. void keyRepeated(int keyCode): Gọi khi một phím bị giữ. String getKeyName(int keyCode): Lấy một chuỗi phím mang thông tin cho phím. 3.5 Lớp Graphics Một đối tượng đồ họa Graphics (còn được gọi là ngữ cảnh đồ họa Graphics) là một dụng cụ để vẽ lên Canvas. Có hai cách để tham chiếu đến đối tượng này: Cách đầu tiên là viết phương thức paint() trong lớp Canvas protected void paint(Graphics g) { ….. } Cách thứ hai là thông qua đối tượng hình ảnh Mutable: Image im=Image.createImage(80,20); Graphics g=im.getGraphics(); 3.5.1 Hỗ trợ màu Một ứng dụng MIDP chỉ có một đối tượng Display. Đối tượng này đuợc dùng để lấy thông tin của màn hình hiển thị hiện tại, ví dụ như số màu hỗ trợ và các phương thức để yêu cầu các đối tượng được hiển thị. Đối tượng Display đơn giản là một bộ quản lý sự hiển thị của thiết bị và điều khiển những gì sẽ được hiển thị ra trên thiết bị. boolean isColor() int numColors() Phương thức đầu tiên cho biết thiết bị có hỗ trợ hiển thị màu hay không. Nếu có thì phương thức thứ 2 sẽ được gọi để xác định số màu được hỗ trợ. Các phương thức tiếp theo dưới đây để lấy về màu và thiết lập màu . void setColor(int RGB); void setColor(int red, int green, int blue); int getColor(); int getBlueComponent(); int getGreenComponent(); int getRedComponent(); void setGrayScale(int value); int getGrayScale(); Chú ý có thể xác định màu bằng 2 cách. Cách 1: xác định một số nguyên đại diện cho 3 giá trị của màu là đỏ, xanh lá cây và xanh dương với 8 bit cho mỗi màu. Hay cách 2 có thể dùng từng tham số riêng biệt để xác định mỗi màu. Khi sử dụng một giá trị để lưu giữ màu, thì màu đỏ sẽ chiếm 8 bit đầu kể từ bên trái, tiếp theo là 8 bit dành cho màu xanh lá cây, sau cùng là màu xanh dương. Dưới đây là cách thiết lập màu chỉ sử dụng một số nguyên: int red = 0, green = 128, blue = 255; ... g.setColor((red << 16) | (green << 8) | blue); ….. Còn có thể xác định màu bằng cách thiết lập giá trị cho 3 tham số: g.setColor(red, green, blue); 3.5.2 Loại nét vẽ Có thể chọn nét khi vẽ đường thẳng, cung và hình chữ nhật trên thiết bị hiển thị. Dưới đây là các phương thức dùng để thiết lập loại nét vẽ int getStrokeStyle(); void setStrokeStyle(int style); Hai kiểu nét vẽ được định nghĩa trong lớp Graphics là nét chấm, và nét liền g.setStrokeStyle(Graphics.DOTTED); g.setStrokeStyle(Graphics.SOLID); 3.5.3 Vẽ đường thẳng Để vẽ đường thẳng, dùng phương thức: Graphics.drawline(). Nó chấp nhận 4 tham số: x1,x2,y1,y2. Các tham số thiết lập trên màn hình 2 điểm (x1,y1), (x2,y2), và một đường thẳng được vẽ giữa chúng. 3.5.4 Vẽ hình chữ nhật Cũng giống như cung thì hình chữ nhật có thể chỉ được vẽ viền bao quanh hoặc tô bên trong. Bên cạnh đó có thể vẽ hình chữ nhật đó có 4 góc là tròn hoặc là vuông. Dưới đây là một số phương thức để vẽ hình chữ nhật: void drawRect(int x, int y, int width, int height); void drawRoundRect(int x, int y, int width, int height, int arcWidth, int arcHeight); void fillRect(int x, int y, int width, int height); void fillRoundRect(int x, int y, int width, int height, int arcWidth, int arcHeight); Khi vẽ hình chữ nhật có 4 góc là tròn thì bạn phải xác định đường kính theo chiều ngang(arcWidth) và đường kính theo chiều dọc(arcHeight). Những tham số này được định nghĩa độ sắc nét của cung theo mỗi chiều. Giá trị càng lớn thể hiện một cung tăng dần, ngược lại là một đường cong hẹp. 3.5.5 Vẽ cung Khi vẽ một cung, có thể vẽ nó chỉ có đường bao xung quanh hay yêu cầu nó được tô bên trong. Cũng có thể bắt đầu bằng cách chỉ định chiều bao quanh bên ngoài của một hình hộp chữ nhật tưởng tượng. Góc bắt đầu xác định vị trí bắt đầu vẽ khung, với giá trị 0 được xác định tại thời điểm 3 giờ. Giá trị dương tính theo ngược chiều kim đồng hồ. Góc của cung chỉ ra rằng có bao nhiêu độ được vẽ tính từ góc ban đầu, đi theo ngược chiều kim đồng hồ. Một số các phương thức dùng để vẽ cung void drawArc(int x, int y, int width, int height, int startAngle, int arcAngle) void fillArc(int x, int y, int width, int height, int startAngle, int arcAngle). 3.5.6 Font chữ Phần sau đây cũng quan trọng không kém là cách sử dụng font chữ được hỗ trợ bởi giao diện cấp thấp của ứng dụng MIDP. Một số các phương thức dựng của lớp Font: Font getFont(int face, int style, int size) Font getFont(int fontSpecifier) Font getDefaultFont() Một số thuộc tính của lớp Font FACE_SYSTEM FACE_MONOSPACE FACE_PROPORTIONAL STYLE_PLAIN STYLE_BOLD STYLE_ITALIC STYLE_UNDERLINED SIZE_SMALL SIZE_MEDIUM SIZE_LARGE Các tham số kiểu dáng có thể được kết hợp thông qua toán tử hay. Ví dụ Font font = Font.getFont(Font.FACE_PROPORTIONAL, Font.STYLE_BOLD | Font.STYLE_ITALIC, Font.SIZE_MEDIUM); Sau khi bạn có một tham chiếu đến một đối tượng Font, bạn có thể truy vấn nó để xác định thông tin của các thuộc tich của nó. int getFace(); int getStyle(); int getSize(); boolean isPlain(); boolean isBold(); boolean isItalic(); boolean isUnderlined(); Kích thước của các font chữ được xác định bởi chiều cao của font chữ, bề dài tính bằng điểm ảnh của một chuỗi ký tự trong một font xác định. Một số các phương thức sau hỗ trợ khi tương tác với một đối tương font int getHeight(); int getBaselinePosition(); int charWidth(char ch); int charsWidth(char[] ch, int offset, int length); int stringWidth(String str); int substringWidth(String str, int offset, int length); 3.5.7 Vẽ các chuỗi ký tự Có thể vẽ chuỗi ký tự ra màn hình thông qua một số các phương thức: void drawChar(char character, int x, int y, int anchor); void drawChars(char[] data, int offset, int length, int x, int y, int anchor); void drawString(String str, int x, int y, int anchor); void drawSubstring(String str, int offset, int len, int x, int y, int anchor); 3.5.8 Vẽ ảnh Lớp Graphics cung cấp 1 phương thức dùng để vẽ ảnh: drawImage(Image img, int x, int y, int anchor); Tham số đầu tiên tham chiếu tới một đối tượng hình ảnh. Chúng ta cần phải tạo ra đối tượng image trước khi gọi drawImage - Đối với hình ảnh không thay đổi: Image image=Image.createImage(/” image source”); - Đối với hình ảnh thay đổi: Image image=Image.createImage(imagewidth, imageheight); 3.5.9 Vùng cắt (Clipping Regions) Đối với mỗi lời gọi đến hàm paint(), toàn bộ màn hình sẽ được vẽ lại. Vùng cắt có thể giới hạn những gì được vẽ trên màn hình. Một lợi ích quan trọng là giảm thời gian để làm mới màn hình. Các phương thức của vùng cắt: void setClip(int x, int y, int width, int height): đặt hình chữ nhật khoanh vùng cắt. void clipRect(int x, int y, int width, int height): giao hình chữ nhật này với hình chữ nhật của vùng cắt hiện thời để tạo ra vùng cắt mới. int getClipX(): lấy tọa độ X của vùng cắt hiện thời. int getClipY(): lấy tọa độ Y của vùng cắt hiện thời. int getClipHeight() : lấy chiều cao của vùng cắt hiện thời. int getClipHeight() : lấy chiều rộng của vùng cắt hiện thời. Chương 4 CƠ CHẾ LƯU TRỮ DỮ LIỆU RMS (Record Management System) 4.1 Giới thiệu hệ thống lưu trữ dữ liệu RMS Việc lưu trữ thông tin cho việc khởi tạo của các ứng dụng là cần thiết và quan trọng. Thông tin mà các ứng dụng có thể lưu trữ như các thông tin cấu hình ứng dụng, thông tin quá trình sử dụng các ứng dụng,…Đối với máy PC thì việc này tương dối dễ dàng khi chúng ta có trong tay nhiều thiết bị lưu trữ như HDD, CD- ROM, USB DISK,…nhưng việc này tương đối khó khăn đối với các ứng dụng trên điện thoại di động. MIDP cung cấp cho chúng ta một đối tượng là Record Management System cho phép chúng ta lưu trữ dữ liệu dưới dạng Record.Các API của đối tuợng này được cung cấp trong gói javax.microedition.rms. Một vùng nhớ trên các thiết bị sử dụng MIDP sẽ được dành riêng cho việc lưu trữ các dữ liệu của ứng dụng MIDlet. Vị trí và kích thước của vùng lưu trữ này đuợc xác định tùy thuộc vào những thiết bị cụ thể. RMS cho phép lưu trữ dữ liệu khi ứng dụng thoát, khởi động lại và khi thiết bị di động tắt hay thay pin. Dữ liệu của ứng dụng sẽ tồn tại trên thiết bị di động cho đến khi ứng dụng thật sự được xóa khỏi thiết bị di động. Khi một MIDlet bị xóa, tất cả các record mà nó lưu trữ cũng bị xóa. Luu trữ bản ghi 1 Luu trữ bản ghi 2 Luu trữ bản ghi 3 MIDlet 1 MIDlet 2 MIDlet 3 Hình 4.1. Lưu trữ dữ liệu Như trong hình vẽ, các MIDlet có thể có nhiều hơn một tập hợp các record và chúng có thể truy xuất đến tập hợp dữ liệu lưu trong bộ MIDlet mà chúng lưu trữ. Do đó, MIDlet 1 và MIDlet 2 có thể truy truy xuất đến Record Store 1 và Record Store 2 nhưng chúng không thể truy xuất đến Record Store 3. Ngược lại, MIDlet 3 chỉ có thể truy xuất Record Store 3 mà không thể truy xuất đến Record Store 1 và Record Store 2. Tên của bộ lưu trữ dữ liệu phải là duy nhất trong một bộ MIDlet nhưng trong các bộ MIDlet khác nhau có thể trùng tên. Hệ thống RMS lưu trữ các bản ghi theo một mảng các byte. Các mảng byte có chiều dài khác nhau và mỗi mảng byte được gán một số ID bản ghi. Các bản ghi được định danh bằng một số ID duy nhất. Các số ID duợc đánh số bắt dầu từ 1. Các số ID sẽ tăng dần và không đuợc dùng lại cho dù bản ghi dó có bị xoá nên sẽ tồn tại một số khoảng trống trong các ID bản ghi. MIDP không kiểm soát việc ghi quá số bản ghi tối đa, diều này phụ thuộc vào ứng dụng. 4.2 Định dạng, thêm, xóa các record Thêm record gồm 2 buớc: buớc đầu tiên là dịnh dạng record theo các yêu cầu và buớc hai là thêm các record đã được định dạng vào RMS. RMS không hỗ trợ sự tuần tự hoá do đó ta phải định dạng các mảng byte dể lưu trữ bản ghi. Sau dây là ví dụ của việc dịnh dạng lưu trữ bản ghi, mở một RMS và sau đó là thêm dữ liệu bản ghi vào RMS. ByteArrayOutputStream baos=new ByteArrayOutputStream(); DataOutoutStream outputStream=new DataOutputStream(baos); outputStream.writeByte(‘T’); outputStream.writeInt(score); outputStream.writeUTF(name); byte[] theRecord=baos.toByteArray(); recordStore rs=null; rs=RecordStore.openRecordStore(“RecordStoreName”,CreateIfNotEx ist); int RecordID=rs.addRecord(theRecord,0,theRecord.length); 4.2.1 Định dạng dữ liệu bản ghi Trong ví dụ trên hai dòng đầu tạo một luồng xuất để ghi dữ liệu bản ghi. Sử dụng đối tuợng DataOutputStream 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ông phải quan tâm dến việc tách nó thành dữ liệu dạng byte. Phương thức writeInt(), writeByte(), writeUTF() định dạng dữ liệu như hình vẽ (tag, score, name). Sử dụng thẻ tag làm có ích để xác định loại record sau này. Phương thức toByteArray() chép dữ liệu trong một luồng xuất thành một mảng byte chứa các bản ghi dể lưu trữ. Biến theRecord tham chiếu đến dữ liệu động dã được định dạng. 4.2.2 Thêm record và RMS Khi dữ liệu dã được định dạng, nó có thể được thêm vào RMS. Phương thức openRecordStore() tạo và mở một RMS với tên là RecordStoreName. Phương thức addRecord dùng để thêm record bắt dầu từ byte 0 của theRecord và trả về ID của bản ghi gắn với record này. 4.2.3 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ức deleteRecord() của đối tượng RecordStore. Khi bản ghi có ID 7 đuợc xóa, thêm mới bản ghi thì bản ghi đó có ID là 8, ID 7 không được dùng lại. 4.3 Lọc bản ghi với RecordFilter Giao diện RecordFilter cung cấp một cách thuận tiện dể lọc các bản ghi theo tiêu chuẩn nhất định, RecordEnumeration có thể duợc dùng để duyệt qua các bản ghi và chỉ trả về các record phù hợp với tiêu chuẩn xác định. Giao diện RecordFilter có phương thức matches() dùng để xác định các tiêu chuẩn phù hợp. Phương thức matches() có tham số đầu vào là mảng byte biểu diễn một bản ghi. Phương thức trả về true nếu bản ghi này phù hợp với tiêu chuẩn đã định nghĩa. 4.4 Duyệt Record với RecordEnumeration Lớp RecordEnumeration cung cấp các phương thức để duyệt các record trong RecordStore một cách nhanh chóng RecordEnumeration re = rs.enumerateRecords(null,null,false); while (re.hasNextElement()) { // Get the next record into a String String str = new String(re.nextRecord()); ... do something ... } RecordEnumeration API int numRecords(): Số lượng record trong 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ó record kế tiếp boolean hasPreviousElement() : Kiểm tra enumeration có record trước đó void keepUpdated(boolean keepUpdated): Đặt enumeration reindex sau khi 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 void destroy() : Giải phóng tài nguyên được sử dụng bởi enumeration. 4.5 Sắp xếp các record với interface RecordComparator Interface này giúp người lập trình so sánh hai Record theo một tiêu chí nào đó. Interface này định nghĩa phương thức compare với trị đầu vào là hai mảng các byte thể hiện hai Record cần so sánh. Phương thức này trả về các trị sau được định nghĩa trong interface: •EQUIVALENT: Nếu hai Record bằng nhau •FOLLOWS: Nếu Record thứ 1 đứng sau Record thứ 2 •PRECEDES: Nếu Record thứ 1 đứng trước Record thứ 2. 4.6 Thông báo những thay đổi với RecordListener Chúng ta cần được thông báo khi được xóa, thêm, hay cập nhật lai. Ví dụ một MIDlet có thể cất giữ những tùy chọn của ứng dụng vào vùng lưu trữ. Khi người dùng thay đổi những thiết lập của họ cho ứng dụng, chương trình cần nhận ra những thay đổi này để MIDlet có thể thực hiện những điều chỉnh cần thiết ngay khi đang chạy. Hoặc chúng ta có một MIDlet quản lý danh sách các thông tin quan hệ (họ tên, ngày sinh, email…). Danh sách có thể được sử dụng bất kỳ lúc nào bởi MIDlet, ví dụ: khi người dùng đang nghi email, họ có thể tìm kiếm bất kỳ một email nào đó trên Server từ xa chứa danh sách các địa chỉ này. Khi một thay đổi xảy ra trên MIDlet, chúng ta phải có khả năng nhận biết những thay đổi này. Chúng ta sử dụng bộ Listener RecordListener để phát hiện các thay đổi trên vùng bản ghi. RecordListener hoạt động như bất kỳ một Listener nào khác trong Java. Nếu đăng ký một Listener, thì khi một sự kiện xuất hiện, phương thức thông báo sẽ được gọi để cho bạn biết sự thay đổi. Có ba phương thức được dùng để báo hiệu sự thay đổi của bản ghi: Void recordAdded ( RecordStore rs, int recorded): Thông báo bản ghi đã được thêm. Void recordChanged ( RecordStore rs, int recorded): Thông báo bản ghi đã bị thay đổi. Void recordDeleted ( RecordStore rs, int recorded): Thông báo bản ghi đã bị xóa. 4.7 Xử lý ngoại lệ Có năm ngoại lệ (Exception) dành riêng cho RMS. Chúng đều được kế thừa từ lớp java.lang.Throwable. InvalidRecordIDException: Cho biết số bản ghi sai. RecordStoreException: Một ngoại lệ chung cho biết lỗi vùng bản ghi. RecordStoreFullEception: Cho biết bản ghi đầy. RecordStoreNotFoundException: Cho biết vùng bản ghi không tồn tại. RecordStoreNotOpenException: Cho biết vùng bản ghi chưa được mở. Chương 5 KHUNG KẾT NỐI CHUNG (GENERIC CONNECTION FRAMEWORK) Mặc dù hạn chế về bộ nhớ và khả năng xử lý nhưng thiết bị di động vẫn hỗ trợ hệ thống xử lý file và các giao thức kết nối mạng. Với kích thước hơn 200 kb và hơn 100 class và interfaces trong gói java.io, java.net của J2SE sẽ chiếm hầu hết bộ nhớ nhỏ bé của những thiết bị đi động. Do đó Sun không thể kế thừa những gói này vào trong J2ME, mà đã xây dựng một chuẩn là Generic Connection Framework (GCF). GCF sẽ giúp cho các thiết bị di động có thể truy xuất được các tài nguyên mạng, cũng như các tài nguyên khác mà địa chỉ của chúng được xác định bằng URL. Generic Connection Framework bao gồm một tập hợp các interfaces được khai báo trong package javax.microedition.io. 5.1 Phân cấp kết nối Ý tưởng cơ bản là dùng một lớp duy nhất, Connector có thể tạo ra bất kỳ kiểu kết nối nào, file, http, datagram…Phương thức mở kết nối có dạng sau: Connector.Open(“ protocol : address ; parameters); Ví dụ: Connector.Open(“”); Connector.Open(“socket://www.some_adress.com”); Connector.Open(“file://www.some_adress.com”); Cách những giao thức này được xử lý chính là tính linh hoạt và vai trò chính của GCF. Khi thực thi Connector sẽ tìm kiếm lớp thích hợp cài đặt giao thức được yêu cầu kết nối. Nó sử dụng Class.forName() để nạp lớp. Một yêu cầu mở kết nối HTTP trong J2ME: Class.forName(“ com.sun.midp.io.j2me.http.Protocol ”); Nếu lớp này được tìm thấy, thì một đối tượng được trả về và đối tượng này được cài đặt giao diện kết nối của connector. Giao diện lớp của Connector và Connection được định nghĩa trong CLDC. Hình bên dưới cho thấy các lớp tạo nên phân cấp kết nối Connection, mỗi lớp được định nghĩa như một giao diện. Connection (Interface) InputConnection (Interface) OutputConnection (Interface) DatagramConnection (Interface) StreamConnection (Interface) Hình 5.1. Phân cấp Connection Các lớp và các phương thức và các phương thức trong GCF: Connection (public abstract interface Connection) public void close() InputConnection( public abstract interface InputConnection extend Connection) public InputStream openInputStream() public DataInputStream openDataInputStream(); OutputConnection(public abstract interface InputConnectin extends Connection) public OutputStream openOutputStream() public DataOutputStream openDataOutputStream() StreamConnection ( public abstract interface StreamConnection extends InputConnection, OutputConnection) ContentConnection (public abstract interface ContentConnection extends StreamConnection) public long getLength() public String getEncoding() public String getType() HttpConnection ( public interface HttpConnection extends ContentConnection). 5.2 Kết nối HTTP Trong MIDP 1.0, giao thức luôn đảm bảo được cài đặt là HTTP. Thông qua lớp HttpConnection, bạn có thể giao tiếp với một máy chủ Server trên mạng, hoặc bất kỳ thiết bị từ xa nào hỗ trợ HTTP. Nếu một thiết bị không trực tiếp hỗ trợ HTTP, ta cần một cổng chuyển tiếp dùng chuyển đổi giao thức thiết sang HTTP trước khi giao tiếp với Server. 5.2.1 Tính khả chuyển Giao diện kết nối Connection duy nhất được MIDP 1.0 hỗ trợ là HttpConnection. Nếu tính khả chuyển là một yêu cầu của chương trình thì chỉ nên sử dụng duy nhất một giao diện này. Các cài đặt khac có thể hỗ trợ những giao thức như gói dữ liệu Datagram hoặc Socket nhưng không bảo đảm rằng những giao thức này sẽ sẵn sang trên mọi thiết bị khác chạy MIDP 1.0. HTTP được xem như giao thức hoạt động theo cớ chế Yêu cầu/Phản hồi (Request/Response). Máy khách Client chuẩn bị một yêu cầu, gửi nó cho một Server với địa chỉ được định dạng theo URL và sau đó là một phản hồi được trả lại từ máy chủ Server. 5.2.2 Tạo kết nối Lớp Connector có bảy phương thức để tạo ra một kết nối tới một máy chủ Server. Có 3 dạng phương thức open(). Phương thức đầu tiên yêu cầu duy nhất địa chỉ Server. Phương thức thứ hai chấp nhận kiểu cho đọc/ghi truyền vào tham số. Phương thức thứ ba có thêm một cờ cho biết người gọi phương thức muốn quản lý các ngoại lệ timeout. public static Connection open ( String name) public static Connection open ( String name, int mode) public static Connection open ( String name, int mode, boolean timeout) pulic static DataInputStream openDataInputStream ( String name) pulic static DataOutputStream openDataOutputStream ( String name) pulic static OutputStream openOutputStream ( String name). 5.2.3 Yêu cầu (Request) của máy khách Client Một yêu cầu máy khách Client, được gọi là yêu cầu thực thể gồm có ba mục: phương thức yêu cầu (Request), header và phần thân. Có ba phương thức yêu cầu có thể sử dụng trong lớp HttpConnection. GET: Gửi yêu cầu bằng chuỗi dữ liệu. POST: Gửi yêu cầu bằng luồng dữ liệu. HEAD: Yêu cầu nhận thông tin mô tả của dữ liệu. Tất cả ba phương thức này đều thong báo cho máy chủ rằng một máy khách đang yêu cầu kiểu thong tin nào đó. GET và POST chỉ khác nha

Các file đính kèm theo tài liệu này:

  • doc32055.doc