Beginning Android for Application - Chapter 10: Networking
Trong chương 8, bạn đã được tìm hiểu cách giao tiếp với thế giới bên ngoài sử dụng
SMS và Email. Có một cách khác để tạo mối liên kết đó là thông qua wireless network. Vì
thế chương này bạn sẽ được học cách sử dụng HTTP protocol để giao tiếp với web servers để
có thể download text và binary data. Bạn còn được tìm hiểu cách làm việc với file XML( rất
cần thiết để truy xuất vào web services). Bên cạnh đó, bạn cũng tìm hiểu JSON(JavaScript
Object Notation). Cuối cùng chúng ta sẽ tìm hiểu về TCP sockets để connect vào server.
Thangit14.blogspot.com Thangit14@gmail.com 1 Chương 10: Networking Trong chương 8, bạn đã được tìm hiểu cách giao tiếp với thế giới bên ngoài sử dụng SMS và Email. Có một cách khác để tạo mối liên kết đó là thông qua wireless network. Vì thế chương này bạn sẽ được học cách sử dụng HTTP protocol để giao tiếp với web servers để có thể download text và binary data. Bạn còn được tìm hiểu cách làm việc với file XML( rất cần thiết để truy xuất vào web services). Bên cạnh đó, bạn cũng tìm hiểu JSON(JavaScript Object Notation). Cuối cùng chúng ta sẽ tìm hiểu về TCP sockets để connect vào server. Consuming Web Services Using HTTP HTTP là giao tiếp thông dụng nhất trên thế giới, với nó bạn có thể thực hiện được rất nhiều công việc, như tải một trang web từ web server, down binary data … Thangit14.blogspot.com Thangit14@gmail.com 2 Thangit14.blogspot.com Thangit14@gmail.com 3 Downloading Binary Data. Một trong những công việc bạn hay gặp đó là tải binary dât từ web. Ví dụ như bạn cần tải một image từ server để hiển thị trong app. Thangit14.blogspot.com Thangit14@gmail.com 4 Thangit14.blogspot.com Thangit14@gmail.com 5 Để tải một bức ảnh, bạn gọi method downloadImage(). Tuy nhiên từ phiên bản 3.0 trở về sau, synchronous operations (hoạt động đồng bộ) không thể chạy trực tiếp từ UI thread. Vì phương thức downloadImage() là synchronous, vì thế nó không trả quyền điều khiển cho đến khi bức ảnh được tải xong – việc gọi nó trực tiếp sẽ làm đóng băng activity của bạn. Và điều đó không được phép từ Android 3.0 trở về sau, tất cả các synchronous code đều phải được bao ngoài bởi AsyncTask class. Việc sử dụng AsyncTask cho phép bạn thực hiện những công việc nền trong một thread riêng biệt và trả kết quả về cho UI thread. Nếu bạn muốn download nhiều ảnh, bạn có thể làm như sau: Thangit14.blogspot.com Thangit14@gmail.com 6 Trong ví dụ này, bạn đã gọi method publishProgress(0 để update trạng thái của tiến trình. Vì thế sẽ gọi đến method onProgressUpdate(), mỗi khi có một image downloaded. Method onProgressUpdate() được thực hiện trên UI thread, vì thế bạn có thể dùng nó để update ImageView với bitmap đã downloaed được. Ví dụ này chưa bắt lỗi khi url không phải là một ảnh. Ở link thứ 2 trong ví dụ, ko trả về một ảnh, nên chương trình xảy ra lỗi. Bạn xóa link thứ 2 để chạy, hoặc thêm try catch để bắt url ko phải là một ảnh. Downloading Text Content. Thangit14.blogspot.com Thangit14@gmail.com 7 Thangit14.blogspot.com Thangit14@gmail.com 8 Truy cập vào Web Services sử dụng GET Method. Bạn sẽ thường phải download file xml từ services về và parse chúng để lấy dữ liệu. Trong ví dụ này, bạn sẽ sử dụng web method từ . Đây là method dùng để giải thích một từ được lấy từ dictionary web service. Webservice này sử dụng request format như sau: Cấu trúc file xml mà nó trả về: Thangit14.blogspot.com Thangit14@gmail.com 9 Thangit14.blogspot.com Thangit14@gmail.com 10 Thangit14.blogspot.com Thangit14@gmail.com 11 Consuming JSON Services Việc sử dụng XML document tốn khá nhiều phép tính toán cho thiết bị là mobile bởi: XML khá là dài dòng. Nó sử dụng tag để biểu diễn thông tin và có kích thước tăng khá nhanh. Một file XML dung lượng lớn làm cho bạn mất băng thông để tải nó về. XML khá khó để xử lý, tính toán. Có một cách thích hợp để biểu diễn thông tin đó là JSON(JavaScrip Object Notation). JSON là một cách lưu trữ tốn ít tài nguyên và dễ dàng cho con người có thể đọc và viết. Và cũng dễ hơn cho thiết bị có thể làm việc với chúng. Thangit14.blogspot.com Thangit14@gmail.com 12 Thông tin được lưu trữ dưới dạng key/values, và mối cặp key/values đó được group trong một list các object. Không giống như XML, JSON không có tag name. Thangit14.blogspot.com Thangit14@gmail.com 13 Thangit14.blogspot.com Thangit14@gmail.com 14 Một ứng dụng rất hay của ví dụ này đó là sử dụng JSON để cập nhật status trên Twitter của bạn. Để làm việc đó bạn chỉ cẩn thay đổi url ở method onCreate. Và sau đó chỉnh sửa một chút để hiển thị ra ngoài màn hình trong method onPostExecute(). SOCKETS Programming Trong nhữ ví dụ trước, bạn đã sử dụng HTTP để kết nối đến server. Hầu như tất cả các web services đều sử dụng HTTP để giao tiếp, tuy nhiên nó lại có một nhược điểm rất lớn là stateless( phi trạng thái). Khi bạn connect vào một web service sử dụng HTTP, mỗi connection được coi như là một connection mới hoàn toàn- web server sẽ không lưu trữ các trạng thái của connection phía client. Hãy tưởng tượng trong trường hợp ứng dụng của bạn conntect vào một web service cho phép đặt vé xem phim. Khi ghế được đặt trên server bởi client, tất cả các client khác sẽ không nhận biết được điều đó cho đến khi họ connect vào web service lại để nhận về các ghế còn trống. Những truy vấn liên tục này bởi client sẽ chịu những bandwith không cần thiết và làm ứng dụng của bạn kém hiệu quả. Một giải pháp tốt hơn đó là server sẽ lưu trữ connection ứng với mỗi cient, và sẽ gửi một message cho chúng mỗi khi có người dùng khác đặt ghế tại phòng mà họ đang xem. Nếu bạn muốn ứng dụng của bạn lưu trữ connection và được báo khi có sự thay đổi phía server, bạn cần sử dụng một kỹ thuật gọi là sockets programming. Đó là kĩ thuật cho phép bạn sử dụng để tạo ra một connection giữa client và server. Ví dụ sau tạo ra mọt client app và được connect đến một socket server. Tất cả app có thể được kết nối đến server và chat tại cùng một thời điểm. Thangit14.blogspot.com Thangit14@gmail.com 15 Thangit14.blogspot.com Thangit14@gmail.com 16 Thangit14.blogspot.com Thangit14@gmail.com 17 Thangit14.blogspot.com Thangit14@gmail.com 18 Thangit14.blogspot.com Thangit14@gmail.com 19 Thangit14.blogspot.com Thangit14@gmail.com 20 Để xử lý các giao tiếp với socket, bạn tạo ra một lớp độc lập là CommsThread( communication Thread). Lớp này extends từ Thread class vì thế tất cả các socket đều được thực hiện trên một thread riêng biệt, và độc lpaajs với main UI thread. Trong lớp này ta định nghĩa 3 object: Socket object cung cấp một client-side TCP socket. Constructor của CommsThread cần một Socket và trả về InputStream và OutputStram được lấy ra từ socket connection. Method run() được gọi khi bạn gọi phương thức start(), luôn lắng nghe dữ liệu đến bằng cách đọc liên tục sử dụng InputStream object. Khi dữ liệu được nhận về, nó update UI của main Activity bằng cách truyền đến nó một tham số chứa trong data được gửi về. Thangit14.blogspot.com Thangit14@gmail.com 21 Phương thức write() hỗ trợ đề write dữ liệu vào socket connection: Và cancel() method sẽ close socket connection Sau đó tại activity main bạn tạo một class asynchoronously( bất đồng bộ) là CreateCommThreadTask. Lớp này tạo một socket connection đến server. Nội dung đầu tiên được gửi từ client sau khi connection được tạo ra đó chính là nickname cho client. Vì thế, sau khi scoket connection được started, bạn ngay lập tức gửi một message đến server chưa nickname mà bạn muốn sử dụng cho client. Class WriteToServerTask cho phép bạn gửi dữ liệu đến server một cách bất đồng bộ, trong khi class CloseSocketTask đóng một socket connection. Khi activity được pause, bạn đóng socket connection, và khi nó được resume, bạn tạo lại một connection . Thangit14.blogspot.com Thangit14@gmail.com 22
File đính kèm:
- Beginning Android for Application - Chapter 10 Networking.pdf