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:

Ở hình vẽ trên, đường thẳng màu xanh đại diện cho luồng thực thi của thread mới được tạo ra để xử lý việc kết nối mạng, nó hoạt động độc lập với main thread(màu đỏ). Nếu bạn download code trong bài này, bạn sẽ tìm thấy ví dụ ThreadedMIDlet.java.

Tuy nhiên, thread mới tạo ra như trên lại gặp một trở ngại khác. Bởi vì các hoạt động kết nối mạng được diễn ra trong một thread mới, nên giao diện người dùng vẫn đáp ứng –  đây thường là một điều tốt, nhưng vấn đề ở đây là: một người dùng thiếu kiên nhẫn có thể nhấn command gọi kết nối liên tục, mỗi lần nhấn command, thì hệ thống sẽ tạo ra quá nhiều thread và sẽ làm tiêu tốn tài nguyên của hệ thống. Bạn có thể xem hình minh họa dưới đây:

Hơn nữa, một câu hỏi được đặt ra ở đây là: người dùng sẽ thấy gì ở giao diện khi ứng dụng đang kết nối mạng. Lúc này, để trả lời câu hỏi trên, bạn nên tạo ra một màn hình chờ trong khi đợi thực hiện việc kết nối mạng, và điều này sẽ làm cho ứng dụng của bạn logic hơn.

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

Rõ ràng, bạn cần phải làm cho người sử dụng chờ đợi  trong khi các MIDlet thực hiện kết nối mạng. Việc hiển thị màn hình chờ để thông báo cho người dùng rằng MIDlet đang bận rộn và cũng có thể ngăn cản người dùng nhấn command liên tục và  tạo ra nhiều thread không đáng có.

Đầu tiên, ta sẽ tạo một form chờ như sau:

mWaitForm = new Form(“Waiting…”);

Để hiện thị màn hình chờ lên màn hình, trong phương thức commandAction(), bạn làm như sau:

public void commandAction(Command c, Displayable s) {

if (c == mExitCommand)

notifyDestroyed();

else if (c == mConnectCommand) {

mDisplay.setCurrent(mWaitForm);

Thread t = new Thread() {

public void run() {

connect();

}

};

t.start();

}

}
Nếu bạn download code của ví dụ này, nó có tên là SimpleWaitMIDlet, và màn hình của nó được hiển thị như sau:

Trong khi màn hình chờ được hiển thị, người dùng không thể nhấn command Connect, vì vậy mà MIDlet sẽ không phát sinh thêm nhiều thread kết nối mạng tại một thời điểm. Tại thời điểm đó, màn hình chờ sẽ làm cho người dụng yên tâm hơn khi biết được ứng dụng vẫn đang làm việc. Nếu bạn muốn vẽ màn hình chờ bằng Canvas thì có thể tìm hiểu ở các ví dụ tiếp theo.

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

Các bài liên quan:
Sử dụng Thread hiệu quả trong J2ME – Phan 1
Sử dụng Thread hiệu quả trong J2ME – Phan 3
Sử dụng Thread hiệu quả trong J2ME – Phan 4