Posts from the ‘J2ME’ Category

Xây dựng TabMenu trên J2ME

Trong bài viết này, tôi xin được giới thiệu đến các bạn cách tạo ra TabMenu. Các component của chúng ta sẽ hỗ trợ:

Các style của Tab: màu nền, màu chữ, font, padding.

Tự động cuộn ngang màn hình mà không cần phải quan tâm tới độ rộng màn hình.

Đầu tiên, ta có các biến về style của Tab:

int background = 0xffffff;
int bgColor = 0xcccccc;
int bgFocusedColor = 0x0000ff;
int foreColor = 0x000000;
int foreFocusedColor = 0xffffff;
int cornerRadius = 4;
int padding = 2;
int margin = 2;
Font font = Font.getDefaultFont();
int scrollStep = 20;

Read more…

scaling bitmaps trong JavaME

Hôm nay, tôi xin giới thiệu với các bạn đoạn code để scale một image, phương thức scaleImage() là phương thức bạn cần quan tâm.

import java.io.IOException;
import javax.microedition.lcdui.Command;
import javax.microedition.lcdui.CommandListener;
import javax.microedition.lcdui.Display;
import javax.microedition.lcdui.Displayable;
import javax.microedition.lcdui.Form;
import javax.microedition.lcdui.Image;
import javax.microedition.midlet.MIDlet;

Read more…

Để viết ứng dụng trên J2ME có hiệu quả – Phần 2

(tiếp theo)

9.Sử dụng mảng đơn

Bạn nên chia mảng đa chiều thành các mảng đơn chiều, và bạn nên cố gắng tránh xa việc sử dụng mảng đa chiều.

10.Sử dụng các phép toán

Bất cứ lúc nào có thể, bạn nên sử dụng toán tử shift để thay thế cho các phép toán số học, ví dụ:

int a=11<<1 thay cho int a=11*2

Ngoài ra, bạn nên tránh sử dụng các phép nhân và phép chia, bởi chúng tốn chi phí hơn phép cộng và phép trừ. Vì thế, bạn nên sử dụng phép cộng và phép trừ để thay thế cho phép nhân và phép chia nếu có thể.

10.Sử dụng các phương thức sẵn có thay vì xây dựng lại

Bạn nên tìm hiểu các phương thức sẵn có của các lớp trong J2ME thay vì viết lại, điều này sẽ giúp bạn giảm thiểu code của ứng dụng. Ví dụ như: String.indexOf(), String.lastIndexOf()…

11.Các lớp lồng(inner)

Đối với các lớp inner, bạn nên sử dụng các lớp static.

Sau khi hoàn tất ứng dụng, nên tinh giảm (obfucater) code.

Không gọi trình thu dọn rác trong code, như System.gc().

Tránh xa việc đồng bộ hóa(synchronized) bởi nó sẽ làm giảm tốc độ thực thi.

12.Quản lý vòng lặp

Cần giảm thiểu số lần lặp nếu có thể. Ví dụ:

for(int i = 0; i < 20; i++)
{
   j += 10;
}

Bạn có thể viết lại như sau:

for(int i == 0; i < 5; i++)
{
   j += 10;
   j += 10;
   j += 10;
   j += 10;
}

13.Tránh xa tính đa hình

Tính đa hình thực sự giúp ích trong việc thiết kế các ứng dụng lớn(thường nó liên quan tới design pattern), nhưng việc gọi các hành vi của lớp đa hình tốn chi phí hơn việc gọi các phương thức thông thường trong Java. Ngoài ra, bạn nên xây dựng các phương thức tĩnh là hiệu quả hơn hết, và dĩ nhiên không phải tất cả các phương thức bạn đều có thể xây dựng ở dạng static.

Bạn thấy bài viết này thế nào?

Các bài liên quan
Để viết ứng dụng trên J2ME có hiệu quả – Phần 1

Lắng nghe các message SMS đang đến: Bất đồng bộ

Trong bài viết này, tôi xin giới thiệu cách thức để cài đặt một MIDlet lắng nghe các tin nhắn SMS đang đến. Luồng hoạt động ở bài viết này được thực hiện một cách bất đồng bộ:

1. Người dùng cài đặt ứng dụng SMSListenerMIDlet vào thiết bị và khởi động nó. Tạm gọi thiết bị này là thiết bị A. Lúc này,MIDlet vẫn chưa lắng nghe các message đang đến, do đó, nếu người dùng bây giờ đã gửi một tin nhắn từ một thiết bị khác – tạm gọi là thiết bị B – thì SMS sẽ không bị chặn bởi các MIDlet. Thay vào đó, nó sẽ đến trong inbox của thiết bị A.

2. Người dùng sẽ để MIDlet bắt đầu nghe các message SMS bằng cách chọn Options> Start listening. Bên trong MIDlet sẽ xảy ra các vấn đề sau:

  • Phương thức startListening() được gọi.
  • Phương thức này sẽ mở một connection với port chỉ định và đăng ký MIDlet để lắng nghe các tin nhắn đến.

3. Từ thiết bị B, người dùng bây giờ có thể gửi tin nhắn với port chỉ định tới thiết bị A, và MIDlet trong thiết bị A sẽ xảy ra các vấn đề sau:

  • Phương thức notifyIncomingMessage() được gọi là do thực thi WMA.
  • Để giảm thiểu thời gian phương thức notifyIncomingMessage(), một thread riêng biệt được tạo ra để tìm nạp message.
  • Một khi thread được bắt đầu, nó sẽ block phương thức receive() cho đến khi có một tin nhắn có sẵn. Điều này không nên dùng lâu dài, kể từ khi MIDlet đã được thông báo rằng có một tin nhắn đang chờ. Tuy nhiên, nó là cách thực hành tốt để đảm bảo rằng phương thức hệ thống notifyIncomingMessage() trả về nhanh chóng.
  • Khi một message SMS đã nhận được, phương thức processMessage() được gọi. Nó sẽ kiểm tra các kiểu tin nhắn thư (kiểu văn bản, nhị phân, hoặc tin nhắn multipart) và xử lý phù hợp. Trong thực tế, nó sẽ hiển thị nội dung tin nhắn lên màn hình. Ở ví dụ này, chỉ xử lý tin nhắn kiểu văn bản.

4. Lưu ý rằng các SMS được gửi với port chỉ định sẽ không bao giờ đến inbox của thiết bị A một khi MIDlet đang lắng nghe chúng. Và bây giờ, nếu người dùng ngừng việc lắng nghe (bằng cách chọn Options> Stop listening), các SMS tiếp theo với cổng được chỉ định sẽ rơi vào inbox của thiết bị A, thay vì MIDlet. Read more…

Lắng nghe các message SMS đang đến

Trong bài viết này, tôi xin trình bày cách để cài đặt một MIDlet lắng nghe các message SMS đang đến. Luồng hoạt động của nó được thực hiện một cách đồng bộ như sau:

  • Người dùng cài đặt ứng dụng SMSListenerMIDlet vào thiết bị và khởi động nó. Tạm gọi thiết bị này là thiết bị A. Lúc này, MIDlet vẫn chưa lắng nghe các message đang đến, do đó nếu lúc này, người dùng gửi một tin nhắn SMS từ một thiết bị khác – tạm gọi thiết bị này là thiết bị B – thì nó sẽ không bị chặn bởi MIDlet. Thay vào đó, SMS sẽ đến trong inbox của thiết bị A.
  • Người dùng sẽ để MIDlet lắng nghe các message đang đến bằng cách chọn Options -> Start listening. Bên trong MIDlet,sẽ xảy ra 2 vấn đề sau:
    • Phương thức startListening() được gọi. Nó sẽ mở một connection vào port chỉ định, tạo ra một thread mới, và kích hoạt nó chạy.
    • Trong phương thức run(), phương thức đồng bộ receive() được gọi, và nó sẽ được block cho đến khi có một tin nhắn available.
    • Từ thiết bị B, bây giờ người dùng có thể gửi SMS, và SMS này sẽ được bắt lấy bởi MIDlet trong A. Và trong MIDlet sẽ xảy ra các vấn đề sau:
      • Khi một tin nhắn đến, phương thức receive() được trả về và phương thức processMessage() được gọi.
      • Phương thức processMessage() kiểm tra kiểu SMS như (kiểu văn bản, nhị phân, hoặc tin nhắn multipart) và xử lý chúng phù hợp. Trong thực tế, nó sẽ hiển thị nội dung văn bản tải của tin nhắn lên màn hình. Trong ví dụ này, chỉ xử lý tin nhắn văn bản.
      • Lưu ý rằng các SMS được gửi với port chỉ định sẽ không bao giờ đến inbox của thiết bị A một khi MIDlet đang lắng nghe chúng. Và bây giờ, nếu người dùng ngừng việc lắng nghe (bằng cách chọn Options> Stop listening), các SMS tiếp theo với cổng được chỉ định sẽ rơi vào inbox của thiết bị A, thay vì MIDlet.

Code của nó như sau: Read more…

Kiểm tra thiết bị có hỗ trợ API gửi tin nhắn hay không

Để kiểm tra version của thiết bị có hỗ trợ API cho phép gửi hay nhận tin nhắn SMS hay không, bạn sử dụng phương thức System.getProperty(“wireless.messaging.version”). Bạn có thể tham khảo đoạn code sau:

import javax.microedition.lcdui.Alert;
import javax.microedition.lcdui.AlertType;
import javax.microedition.lcdui.Display;

[…]

String wmVersion = System.getProperty("wireless.messaging.version");
if (wmVersion != null) {
    // Wireless messaging is supported. Inform the user.
    Alert alert = new Alert("Supported",
        "Wireless messaging is supported. Version is: " + wmVersion,
        null, AlertType.INFO);
    Display.getDisplay(this).setCurrent(alert);
} else {
    // Wireless messaging is not supported. Inform the user.
    Alert alert = new Alert("Not supported",
        "Wireless messaging is not supported.", null,
        AlertType.INFO);
    Display.getDisplay(this).setCurrent(alert);
}

Tham khảo code từ forum Nokia

Sử dụng Thread hiệu quả trong J2ME – Phan 4

Xây dựng màn hình chờ bằng Canvas

Bây giờ, chúng ta sẽ xây dựng màn hình chờ gọi là WatiCanvas, nó được kế thừa từ Canvas. Nó sẽ hiển thị một bánh xe quay và các tính năng nhắn tin có thể được cập nhật tự động. Để chuyển động bánh xe, tôi sử dụng thêm một thread (một Timer) được khởi tạo trong constructor của WaitCanvas. Sơ đồ thread bây giờ bao gồm một thread màu hồng cho các chuyển động của màn hình chờ.

Xây dựng lớp WaitCanvas như sau: Read more…

Sử dụng Thread hiệu quả trong J2ME – Phan 3

Xử lý màn hình chờ

Để cải tiến SimpleWaitMIDlet, chúng ta sẽ xử lý phương thức connect() vào một lớp riêng biệt, gọi là CleanWorker, lúc đó ta sẽ đổi lại SimpleWaitMIDlet thành CleanMIDlet.

Bởi vì mạng không dây có xu hướng chậm và không ổn định, nên ta sẽ thêm một tùy chọn để người dùng có thể hủy kết nối nếu chờ quá lâu.

CleanMIDlet sẽ xử lý việc tạo ra các command và lưu trữ một tham chiếu vào một biến thành viên có tên là mCancelCommand; đồng thời CleanMIDlet là một CommandListener chung cho cả mainform và waitform.

import java.io.*;
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;

public class CleanMIDlet extends MIDlet implements CommandListener {

private Display mDisplay;
private Form mMainForm, mWaitForm;
private Command mExitCommand, mConnectCommand, mCancelCommand;
private CleanWorker mWorker; Read more…

Sử dụng Thread hiệu quả trong J2ME – Phan 2

Sử dụng một thread mới cho việc kết nối mạng

Để khắc phục lỗi nói trên, bạn tạo ra một thread mới cho việc kết nối mạng. Thay vì gọi phương thức connect() trong main thread, trong phương thức commandAction() bạn xử lý như sau:

public void commandAction(Command c, Displayable s) {

if (c == mExitCommand)

notifyDestroyed();

else if (c == mConnectCommand) {

Thread t = new Thread() {

public void run() {

connect();

}

};

t.start();

}

}

Lúc này, luồng thực thi của hệ thống sẽ được biểu diễn như hình minh họa dưới đây:

Read more…

Sử dụng Thread hiệu quả trong J2ME – Phan 1

Một ứng dụng hoạt động trơn tru, mạnh mẽ đã thực sự thành công hay chưa?

Tôi khẳng định là chưa, một ứng dụng mạnh mẽ với một giao diện người dùng nghèo sẽ không được phổ biến, cho dù nó chạy trên máy tính để bàn hoặc các thiết bị nhỏ. Đối với người dùng desktop, với nhiều năm kinh nghiệm, có thể chịu được các giao diện có hơi vụng về. Tuy nhiên đối với các thiết bị nhỏ, nó rơi vào các chủng loại thiết bị điện tử tiêu dùng, nơi mà người dùng đang kỳ vọng cao hơn và khắt khe hơn rất nhiều.

Nhiều MIDlets tạo ra các kết nối vào mạng. Bởi vì các mạng không dây ngày nay rất chậm, một câu hỏi đặt ra với giao diện người dùng là: loại feedback  nào người sử dụng xem? Và bạn sẽ thấy, trả lời câu hỏi này sẽ dẫn đến một cuộc thảo luận về đa luồng(multithread).

Bài viết này mô tả một số phương pháp tiếp cận để cung cấp các thông tin phản hồi trong thời gian hoạt động của người sử dụng mạng, và để quản lý các thread thích hợp hơn. Ví dụ đầu tiên là tạo ra một MIDlet đơn giản mà không cung cấp thông tin phản hồi, sau đó dần dần cải tiến nó.

Ví dụ 1:

import java.io.*;

import javax.microedition.io.*;

import javax.microedition.midlet.*;

import javax.microedition.lcdui.*;

public class PrimitiveMIDlet extends MIDlet

implements CommandListener {

private Display mDisplay;

private Form mMainForm;

private Command mExitCommand, mConnectCommand;

Read more…