request lên HTTP server trong một thread khác. Khi thread này hoạt động, thread chính vẫn hiển thị giao diện UI của ứng dụng, cụ thể nó sẽ hiển thị một dialog thông báo là đang kết nối tới internet, khi nào toàn bộ thao tác kết nối rồi nhận dữ liệu, xử lý dữ liệu trong thread kia thành công thì một message được gửi về thread chính thông qua object handler, hàm handleMessage của object handler sẽ được gọi, và
làm nhiệm vụ hiển thị thông tin nào cần lên giao diện UI của người sử dụng. Rất nhiều phần trong ứng dụng Android phải thực hiện kết nối này, chính vì vậy, em đã thiết kế và viết 1 class chung để thực hiện công việc kết nối này là class HttpRequestHelper. Sau đây là ví dụ trong activity Register thực hiện kết nối tới server:
public class RegisterAc extends Activity { ………
private Handler handler = new Handler() { (1)
public void handleMessage(Message msg) { String loginmsg = (String)
msg.getData().getString("RESPONSE");
………
intent.setClass(getApplicationContext(), LoginAc.class);
intent.putExtras(extras); startActivity(intent); }
};
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); ……….
joinBut.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
showDialog(0); (2)
t = new Thread() {
public void run() {
tryRegister(); (3) } }; t.start(); } }); }
private void tryRegister() { (4) ………
final ResponseHandler<String> responseHandler = HTTPRequestHelper
.getResponseHandlerInstance(this.handler);
HTTPRequestHelper helper = new
HTTPRequestHelper(responseHandler); (5)
………
helper.performPost(contentType, url, null, null, null,
params);}
Các bước thực hiện như sau, đầu tiên, ta tạo một object handler (ở phần (1)), như vậy handler này sẽ thuộc về thread chính, là thread quản lý hiển thị giao diện, đến (2) khi người dùng điền đầy đủ thông tin vào các form đăng ký và bấm nút đăng ký thì ta tạo một thread t, và đưa toàn bộ công việc kết nối tới server vào thread này (phần (3)), toàn bộ công việc này được thực hiện trong hàm tryRegister() và hàm này được đặt trong hàm run() của thread t. Như vậy, bên trong hàm
tryRegister, mọi công việc được thực hiện ở thread t, và dòng chảy thông tin như sau: ta tạo một object HttpRequestHelper với tham số đầu vào cho constructor là object handler của thread điều khiển UI, sau đó truyền tham số nó vào vector params, rồi sau đó truyền địa chỉ URL, content Type vào object này rồi gọi hàm performPost, hàm này thực hiện kết nối đến Http server, nhận được kết quả, truyền message cho thread chính (thread quản lý UI) thông quan object handler. Khi nhận được message, lập tức hàm handlerMessage được tự động gọi, hàm này sẽ thực hiện update thông tin lên giao diện UI, cụ thể là chuyển tiếp giao diện người dùng sang activity Login và thực hiện thao tác login với tài khoản vừa được tạo.
1.9.3. Thành phần parse XML
Như đã trình bày ở trên, khi giao tiếp với foloyu server, ứng dụng Android gửi Http Request lên với tham số hợp tùy thuộc vào chức năng cần gọi, server sẽ xử lý yêu cầu và trả về file XML với định dạng dữ liệu đã được quy ước từ trước.
a. Giao diện dữ liệu giao tiếp với server
Để thực hiện việc giao tiếp với server một cách hiệu quả, giữa client Android và server giao tiếp thông qua file xml đã được quy định trước. Giao diện này như sau:
o Nếu truy xuất dữ liệu trả về có dữ liệu thì file XML sẽ có định dạng sau: <root value="true">
<location LocationID="745589766521555" LocationName="công viên Thủ Lệ 1" Address="Nguyễn Văn Ngọc, Kim Mã, Ba Đình, Hà Nội" Phone="" Fax="" Email="" Website="" Overview=" " Lat="21.031469106673583" Long="105.80902576446226" Iconname="" Catid="12" ParentID="0" TotalRate="154" AvgRating="100.0"/>
<location LocationID="781608336373336" LocationName="li po " Address="lo do Phúc Xá, Ba Đình, Hà Nội" Phone="0123623345" Fax="" Email="" Website="" Overview="" Description="" Lat="21.030997037886962" Long="105.7961726188629" Iconname="" Catid="" ParentID="0" TotalRate="154" AvgRating="80.0"/>
</root>
Giá trị thuộc tính value là true, qua đó, phía client sẽ nhận biết được thông tin nhận về có đúng hay không.
<root value="false"> < Message msg=”Error”/> </root>
Giá trị thuộc tính value là false, đồng thời đưa ra thông báo lỗi trong thẻ Message.
b. Thiết kế lớp thành phần parse XML
Thành phần này sẽ đón các file XML từ trên mạng về, rồi phân tích theo giao diện dữ liệu được quy ước sẵn, các thông tin sau khi được phân tích sẽ được đóng gói vào các object thuộc gói Java bean, để cho các Activity khi cần, sẽ lấy dữ liệu ra và hiển thị lên trên giao diện GUI. Quá trình phân tích XML khá đơn giản, ta sẽ đọc từ trên xuống, đến từng tag một lấy dữ liệu rồi lưu vào object java bean thông qua các hàm setter. Có hai trình phân tích phổ biến là SAX và DOM, trong ứng dụng của mình em lựa chọn sử dụng SAX.
Hình 3-18: Sơ đồ lớp thành phần Parse XML