So sánh các kiểu chia sẽ kết nối internet android
Hầu hết ứng dụng Android trên thị trường đều kết nối với Internet để thực hiện một số thao tác mạng. Chẳng hạn như truy xuất email, tin nhắn hoặc thông tin tương tự qua một máy chủ phụ trợ. Ví dụ: Gmail, YouTube và Google Photos là một số ứng dụng có kết nối với Internet để hiển thị dữ liệu của người dùng. Show
Trong lớp học lập trình này, bạn sẽ sử dụng các thư viện nguồn mở được phát triển để xây dựng lớp mạng (network layer) và nhận dữ liệu qua một máy chủ phụ trợ. Việc này giúp đơn giản hoá quá trình tìm nạp dữ liệu, đồng thời hỗ trợ ứng dụng tuân thủ các phương pháp hay nhất của Android, chẳng hạn như thực hiện thao tác trên một luồng ở chế độ nền. Bạn cũng sẽ cập nhật giao diện người dùng của ứng dụng nếu Internet bị chậm hoặc không hoạt động. Việc này giúp người dùng luôn nắm được mọi vấn đề về kết nối mạng. Kiến thức bạn cần có
Kiến thức bạn sẽ học được
Bạn sẽ thực hiện
Bạn cần có
2. Tổng quan về ứng dụngTrong lộ trình học tập này, bạn sẽ xử lý một ứng dụng bắt đầu có tên là MarsPhotos, cho thấy hình ảnh bề mặt sao Hoả. Ứng dụng này kết nối với một dịch vụ web để truy xuất và hiển thị ảnh sao Hoả. Những bức ảnh này là ảnh chụp sao Hoả thực tế được chụp qua thiết bị thám hiểm sao Hoả của NASA. Dưới đây là ảnh chụp màn hình của ứng dụng hoàn thiện, hiện các hình ảnh thuộc tính thu nhỏ (thumbnail) theo bố cục lưới được xây dựng bằng
7. Phiên bản ứng dụng bạn xây dựng trong lớp học lập trình này sẽ không có nhiều hình ảnh trực quan, vì phiên bản này tập trung vào lớp kết nối mạng của ứng dụng để kết nối Internet và tải dữ liệu thuộc tính thô bằng dịch vụ web. Để đảm bảo dữ liệu được truy xuất và phân tích cú pháp chính xác, bạn sẽ chỉ in số lượng ảnh nhận được qua máy chủ phụ trợ trong chế độ xem văn bản: 3. Khám phá ứng dụng bắt đầu MarsPhotosTải mã khởi độngLớp học lập trình này cung cấp mã khởi động để bạn mở rộng bằng các tính năng được dạy ở đây. Mã khởi động có thể chứa mã mà bạn đã biết và chưa biết từ các lớp học lập trình trước. Bạn sẽ tìm hiểu thêm về mã mới trong các lớp học lập trình về sau. Nếu bạn sử dụng mã khởi động lấy trên GitHub, hãy lưu ý tên thư mục là
8. Hãy chọn thư mục này khi bạn mở dự án trong Android Studio.
Mở dự án trong Android Studio
Lưu ý: Nếu Android Studio đã mở thì chuyển sang chọn tuỳ chọn File (Tệp) > Open (Mở) trong trình đơn.
Chạy mã bắt đầu
Hướng dẫn từng bước về mã khởi độngTrong nhiệm vụ này, bạn sẽ tự làm quen với cấu trúc của dự án. Sau đây là hướng dẫn từng bước về các tệp và thư mục quan trọng trong dự án.
1
9
7:
3: nhiệm vụ duy nhất của hoạt động (activity) này là tải bố cục của hoạt động,
4.
5 đây là bố cục hoạt động chính với một
6 duy nhất trỏ đến
6, mảnh tổng quan (overview fragment) sẽ được tạo thực thể khi ứng dụng mở ra. 4. Tổng quan về ứng dụngTrong lớp học lập trình này, bạn tạo một lớp dành cho dịch vụ mạng giao tiếp với máy chủ phụ trợ và tìm nạp dữ liệu cần thiết. Bạn sẽ sử dụng một thư viện của bên thứ ba để triển khai quy trình này, thư viện này có tên Retrofit. Bạn sẽ tìm hiểu thêm về thư viện này sau.
4 trực tiếp giao tiếp với lớp mạng đó, phần còn lại của ứng dụng sẽ tự điều chỉnh theo trong quá trình triển khai.
3 chịu trách nhiệm thực hiện lệnh gọi qua mạng để nhận dữ liệu ảnh sao Hoả. Trong
4, bạn sử dụng
5 với tính năng liên kết dữ liệu có nhận biết vòng đời để cập nhật giao diện người dùng ứng dụng khi dữ liệu thay đổi. 5. Dịch vụ web và RetrofitDữ liệu ảnh sao Hoả được lưu trữ trên máy chủ web. Để đưa dữ liệu này vào ứng dụng, bạn cần thiết lập kết nối và giao tiếp với máy chủ trên Internet. Ngày nay, hầu hết máy chủ web chạy dịch vụ web bằng cách sử dụng một kiến trúc web không có trạng thái (stateless) phổ biến được gọi là REST, viết tắt của REpresentational State Transfer (Kiến trúc chuyển trạng thái đại diện). Các dịch vụ web cung cấp kiến trúc này được gọi là các dịch vụ RESTful. Các yêu cầu được gửi đến dịch vụ web RESTful theo một cách được chuẩn hoá thông qua các URI. Mỗi URI (Uniform Resource Identifier – mã nhận dạng tài nguyên thống nhất) xác định một tài nguyên trong máy chủ theo tên mà không bao hàm vị trí của tài nguyên đó hay cách truy cập vào tài nguyên đó. Ví dụ: trong ứng dụng dành cho bài học này, bạn truy xuất URL hình ảnh bằng cách sử dụng URI máy chủ sau (Máy chủ này lưu trữ cả ảnh sao Hoả và ảnh bất động sản trên sao Hoả): android-kotlin-fun-mars-server.appspot.com Bộ định vị tài nguyên thống nhất (Uniform Resource Locator – URL) là một URI chỉ định phương thức hành động hay yêu cầu biểu diễn tài nguyên, tức là xác định cả cơ chế truy cập chính và vị trí mạng. Ví dụ: URL sau đây liệt kê danh sách tất cả tài sản bất động sản hiện có trên sao Hoả! https://android-kotlin-fun-mars-server.appspot.com/realestate URL sau đây liệt kê danh sách ảnh sao Hoả: https://android-kotlin-fun-mars-server.appspot.com/photos Các URL này tham chiếu đến một tài nguyên đã xác định (chẳng hạn như /realestate hoặc /photos) có thể truy cập được bằng Giao thức truyền siêu văn bản (http: – Hypertext Transfer Protocol) qua mạng. Bạn sẽ dùng điểm cuối /photos trong lớp học lập trình này. Yêu cầu dịch vụ webMỗi yêu cầu dịch vụ web chứa một URI và được chuyển tới máy chủ bằng chính giao thức HTTP mà các trình duyệt web (như Chrome) sử dụng. Các yêu cầu HTTP chứa một thao tác để cho máy chủ biết cần làm gì. Có thể kể đến một số thao tác HTTP phổ biến như sau:
Ứng dụng của bạn sẽ gửi một yêu cầu HTTP GET tới máy chủ về việc cung cấp thông tin liên quan đến ảnh sao Hoả, sau đó máy chủ trả về phản hồi cho ứng dụng, bao gồm cả URL hình ảnh. Phản hồi của một dịch vụ web thường được định dạng bằng một trong các định dạng web phổ biến như XML hoặc JSON, dùng để trình bày dữ liệu có cấu trúc trong các cặp khoá-giá trị. Bạn có thể tìm hiểu thêm về JSON trong một nhiệm vụ sắp tới. Trong nhiệm vụ này, bạn thiết lập kết nối mạng với máy chủ, giao tiếp với máy chủ và nhận phản hồi JSON. Bạn sẽ sử dụng một máy chủ phụ trợ đã được viết sẵn cho bạn. Trong lớp học lập trình này, bạn sẽ dùng thư viện Retrofit, một thư viện bên thứ ba để giao tiếp với máy chủ phụ trợ. Thư viện bên ngoàiThư viện bên ngoài hoặc thư viện bên thứ ba giống như phần mở rộng cho các API Android cốt lõi. Các thư viện này chủ yếu là nguồn mở, do cộng đồng phát triển và duy trì nhờ đóng góp tập thể của cộng đồng Android lớn mạnh trên toàn thế giới. Các thư viện này giúp các nhà phát triển Android như bạn xây dựng ứng dụng tốt hơn. Thư viện RetrofitThư viện Retrofit mà bạn sắp sử dụng trong lớp học lập trình này để trao đổi với dịch vụ web RESTful sao Hoả là một ví dụ điển hình về thư viện được hỗ trợ và duy trì tốt. Bạn có thể nhận thấy điều này bằng cách xem trang GitHub của thư viện, kiểm tra các vấn đề còn tồn đọng (một vài trong số đó là yêu cầu về tính năng) và các vấn đề đã đóng. Nếu các nhà phát triển thường xuyên giải quyết những vấn đề này và phản hồi yêu cầu về tính năng, có nghĩa thư viện được duy trì tốt và là một ứng viên phù hợp để dùng trong ứng dụng. Những nhà phát triển này còn soạn cả trang tài liệu Retrofit để giúp bạn tìm hiểu thêm. Thư viện Retrofit sẽ giao tiếp với phần phụ trợ. Thư viện này tạo URI cho dịch vụ web dựa trên các tham số mà chúng ta truyền vào. Bạn sẽ biết thêm thông tin về việc này trong các phần sau. Thêm phần phụ thuộc RetrofitAndroid Gradle cho phép bạn thêm các thư viện bên ngoài vào dự án của mình. Ngoài phần phụ thuộc thư viện, bạn cũng cần đưa vào kho lưu trữ nơi lưu trữ thư viện. Các thư viện của Google như ViewModel và LiveData trong thư viện Jetpack được lưu trữ trong kho lưu trữ của Google. Phần lớn thư viện cộng đồng như Retrofit đều được lưu trữ trên kho lưu trữ Google và MavenCentral.
Phần phụ thuộc đầu tiên là dành cho chính thư viện Retrofit2 và phần phụ thuộc thứ hai là dành cho bộ chuyển đổi vô hướng Retrofit (Retrofit scalar converter). Bộ chuyển đổi này cho phép Retrofit trả về kết quả JSON dưới dạng
8. Cả hai thư viện hoạt động cùng nhau.
Thêm khả năng hỗ trợ các tính năng ngôn ngữ Java 8Nhiều thư viện của bên thứ ba (bao gồm cả Retrofit2) sử dụng các tính năng ngôn ngữ Java 8. Trình bổ trợ Android cho Gradle cung cấp khả năng hỗ trợ tích hợp để sử dụng một số tính năng ngôn ngữ Java 8 nhất định.
6. Kết nối với InternetBạn sẽ sử dụng thư viện Retrofit để trao đổi với dịch vụ web sao Hoả và hiện phản hồi JSON thô dưới dạng
8. Phần giữ chỗ
8 sẽ cho thấy chuỗi phản hồi JSON được trả về hoặc thông báo lỗi kết nối. Retrofit tạo một API mạng cho ứng dụng dựa trên nội dung từ dịch vụ web. Retrofit tìm nạp dữ liệu qua dịch vụ web và định tuyến dữ liệu này thông qua một thư viện chuyển đổi riêng biệt biết cách giải mã và trả lại dữ liệu dưới dạng các đối tượng như
8. Retrofit có tính năng hỗ trợ tích hợp cho các định dạng dữ liệu phổ biến như XML và JSON. Cuối cùng, Retrofit sẽ tạo mã để gọi và sử dụng dịch vụ này cho bạn, bao gồm cả các thông tin chi tiết quan trọng như chạy yêu cầu trên các luồng ở chế độ nền. Trong nhiệm vụ này, bạn sẽ thêm một lớp mạng vào dự án MarsPhotos mà
4 sẽ sử dụng để giao tiếp với dịch vụ web. Bạn sẽ triển khai API của dịch vụ Retrofit, qua các bước sau.
Triển khai các bước trên:
Nhập
9, khi được nhắc.
Nhập
04 khi được nhắc.
Nhập
12 khi có yêu cầu.
0 Khai báo đối tượngTrong Kotlin, được dùng để khai báo các đối tượng singleton. Mẫu singleton đảm bảo tạo một và chỉ một thực thể của đối tượng và thực thể này sẽ có một điểm truy cập toàn cục đến đối tượng đó. Hoạt động khởi chạy của quá trình khai báo đối tượng sẽ an toàn theo luồng và được thực hiện ở lần truy cập đầu tiên. Kotlin giúp bạn dễ dàng khai báo các singleton. Sau đây là ví dụ về nội dung khai báo cũng như quyền truy cập của đối tượng. Nội dung khai báo đối tượng luôn có tên đứng sau từ khoá
16. Ví dụ:
1 Lệnh gọi hàm Create() trên đối tượng Retrofit rất tốn kém và ứng dụng chỉ cần duy nhất một thực thể của dịch vụ API Retrofit. Vì vậy, bạn sẽ cho thấy dịch vụ ở các phần còn lại của ứng dụng bằng cách khai báo đối tượng.
2
3
4 Đã thiết lập xong Retrofit! Mỗi khi ứng dụng của bạn gọi
25, phương thức gọi sẽ truy cập vào chính đối tượng singleton Retrofit triển khai
5 được tạo trong lần truy cập đầu tiên. Trong nhiệm vụ tiếp theo, bạn sẽ sử dụng đối tượng Retrofit mà bạn đã triển khai. Gọi dịch vụ web trong OverviewViewModelỞ bước này, bạn sẽ triển khai phương thức
3 gọi dịch vụ Retrofit, sau đó xử lý chuỗi JSON trả về. ViewModelScopelà phạm vi coroutine tích hợp sẵn được khai báo cho mỗi
4 trong ứng dụng. Mọi coroutine chạy trong phạm vi này sẽ tự động bị huỷ nếu
4 bị xoá. Bạn sẽ sử dụng
28 để chạy coroutine và thực hiện lệnh gọi mạng Retrofit ở chế độ nền.
5
6
7 Nhập
40
41 và
42 khi được nhắc.
8 Nhập
49 khi được nhắc.
9
0 Thông báo lỗi này cho biết có thể ứng dụng bị thiếu các quyền
52. Bạn sẽ giải quyết vấn đề này bằng cách thêm quyền truy cập Internet cho ứng dụng trong nhiệm vụ tiếp theo. 7. Thêm quyền Internet và xử lý ngoại lệQuyền trên AndroidMục đích của các quyền (permission) trên Android là bảo vệ quyền riêng tư của người dùng Android. Ứng dụng Android phải khai báo hoặc yêu cầu cấp quyền nếu muốn truy cập vào dữ liệu nhạy cảm của người dùng, chẳng hạn như danh bạ, nhật ký cuộc gọi và một số tính năng nhất định của hệ thống, chẳng hạn như máy ảnh hoặc Internet. Để có thể truy cập Internet, ứng dụng của bạn cần có quyền
52. Kết nối Internet dẫn đến nhiều mối lo ngại về bảo mật, do đó, các ứng dụng đều không có kết nối Internet theo mặc định. Bạn cần phải khai báo rõ ràng rằng ứng dụng cần truy cập Internet. Đây được coi là một quyền thông thường. Để tìm hiểu thêm về các quyền trên Android cũng như các loại quyền, vui lòng tham khảo tài liệu này. Ở bước này, ứng dụng của bạn khai báo (các) quyền mà ứng dụng cần bằng cách đưa các thẻ
54 vào tệp
55.
1
2 Thông báo lỗi này cho biết ứng dụng đã cố gắng kết nối nhưng hết thời gian chờ. Những ngoại lệ như thế này rất phổ biến trong thời gian thực. Trong bước tiếp theo, bạn sẽ tìm hiểu cách xử lý các trường hợp ngoại lệ như vậy. Xử lý ngoại lệNgoại lệ (Exception) là các lỗi có thể xảy ra trong thời gian chạy (không phải thời gian biên dịch) và làm ứng dụng chấm dứt đột ngột mà không thông báo cho người dùng. Tình trạng này có thể đem lại trải nghiệm không tốt cho người dùng. Xử lý ngoại lệ là một cơ chế giúp bạn ngăn chặn tình trạng ứng dụng chấm dứt đột ngột và xử lý theo cách thân thiện với người dùng. Lý do của các ngoại lệ có thể đơn giản như phép chia cho không hoặc lỗi kết nối mạng. Các ngoại lệ này tương tự như
58 mà bạn từng tìm hiểu trong một lớp học lập trình trước đây. Ví dụ về một số vấn đề có thể xảy ra khi kết nối với máy chủ:
Bạn không thể phát hiện các ngoại lệ này trong quá trình biên dịch. Bạn có thể sử dụng một khối
59 để xử lý ngoại lệ trong thời gian chạy. Để tìm hiểu thêm, vui lòng tham khảo tài liệu. Cú pháp mẫu cho khối try-catch
3 Trong khối
60, bạn thực hiện mã này trong trường hợp mà bạn dự đoán là sẽ xảy ra ngoại lệ. Trong ứng dụng của bạn, đây sẽ là một lệnh gọi mạng. Trong khối
61, bạn sẽ triển khai mã ngăn chặn tình trạng chấm dứt ứng dụng đột ngột. Nếu có một ngoại lệ thì khối
61 sẽ được thực thi để khôi phục lỗi thay vì chấm dứt ứng dụng đột ngột.
4
5
8. Phân tích cú pháp phản hồi JSON bằng MoshiJSONDữ liệu yêu cầu thường được định dạng theo một trong những định dạng dữ liệu phổ biến như XML hoặc JSON. Mỗi lệnh gọi đều trả về dữ liệu có cấu trúc và ứng dụng của bạn cần biết cấu trúc đó là gì để đọc được dữ liệu trong phản hồi. Ví dụ: trong ứng dụng này, bạn sẽ truy xuất dữ liệu qua máy chủ này: https:// android-kotlin-fun-mars-server.appspot.com/photos. Nếu nhập URL này vào trình duyệt, bạn sẽ thấy danh sách mã và URL ảnh bề mặt sao Hoả ở định dạng JSON! Cấu trúc của phản hồi JSON mẫu:
Ví dụ:
73 là một URL và đó cũng là một chuỗi. Nếu dán URL vào một trình duyệt web, bạn sẽ thấy hình ảnh bề mặt sao Hoả. Lúc này, bạn đã nhận được phản hồi JSON qua dịch vụ web sao Hoả. Đây là một khởi đầu tuyệt vời. Nhưng những gì bạn thực sự cần là các đối tượng Kotlin, không phải là một chuỗi JSON lớn. Có một thư viện bên ngoài có tên Moshi, là một trình phân tích cú pháp JSON Android để chuyển đổi chuỗi JSON thành các đối tượng Kotlin. Retrofit có một bộ chuyển đổi dùng được với Moshi, vì vậy đây là thư viện tuyệt vời dành cho mục đích hiện tại của bạn. Trong nhiệm vụ này, bạn sử dụng thư viện Moshi cùng Retrofit để phân tích cú pháp phản hồi JSON qua dịch vụ web thành các đối tượng Kotlin hữu ích biểu thị ảnh sao Hoả. Bạn sẽ thay đổi ứng dụng để hiện số lượng ảnh sao Hoả được trả về (thay vì cho thấy JSON thô). Thêm phần phụ thuộc của thư viện Moshi
6
Thay thế đoạn mã này
7 bằng đoạn mã này
8
Triển khai lớp dữ liệu Mars PhotosMục mẫu của phản hồi JSON mà bạn nhận được qua dịch vụ web có dạng như sau, tương tự như những gì bạn từng thấy:
9 Trong ví dụ trên, lưu ý rằng mỗi mục ảnh sao Hoả có các cặp giá trị và khoá JSON như sau:
Moshi phân tích cú pháp dữ liệu JSON này và chuyển đổi thành các đối tượng Kotlin. Để làm điều này, Moshi cần có một lớp dữ liệu Kotlin để lưu trữ các kết quả đã phân tích cú pháp. Do đó, ở bước này, bạn sẽ tạo lớp dữ liệu
81.
0
1 Hãy lưu ý rằng mỗi biến trong lớp
81 tương ứng với một tên khoá trong đối tượng JSON. Để khớp với các kiểu trong phản hồi JSON cụ thể, bạn sử dụng đối tượng
8 cho mọi giá trị. Khi phân tích cú pháp JSON, Moshi sẽ so khớp các khoá theo tên rồi điền thông tin thích hợp vào đối tượng dữ liệu. Chú thích @JsonĐôi khi tên khoá trong phản hồi JSON có thể làm cho các thuộc tính Kotlin nhầm lẫn hoặc không khớp với kiểu mã hoá đề xuất. Ví dụ: trong tệp JSON, khoá
73 sử dụng dấu gạch dưới, trong khi quy ước Kotlin cho các thuộc tính sử dụng chữ hoa và chữ thường ("kiểu lạc đà"). Để sử dụng tên biến trong lớp dữ liệu khác với tên khoá trong phản hồi JSON, hãy sử dụng chú thích
91. Trong ví dụ này, tên của biến trong lớp dữ liệu là
92. Bạn có thể liên kết biến này với thuộc tính JSON
73 bằng
94.
2 Cập nhật MarsApiService và OverviewViewModelTrong nhiệm vụ này, bạn sẽ tạo một đối tượng Moshi bằng cách sử dụng Moshi Builder (trình tạo Moshi), tương tự như trình tạo Retrofit. Bạn sẽ thay thế
03 bằng
98 để cho Retrofit biết rằng ứng dụng có thể sử dụng Moshi để chuyển đổi phản hồi JSON thành đối tượng Kotlin. Sau đó, bạn sẽ cập nhật API mạng và
4 để sử dụng đối tượng Moshi.
Xoá:
3
4 Nhập
03 và
04 khi được yêu cầu.
5
6 Nhập
11 khi có yêu cầu.
7
8 Nhập
26 khi được nhắc.
9. Mã giải pháp
0 Đây là các phần phụ thuộc mới cần đưa vào.
9
28 Thêm quyền truy cập Internet, mã
29 trong đoạn mã dưới đây.
0
30
1
8
2
32
3 10. Tóm tắtDịch vụ web REST
Phân tích cú pháp JSON
11. Tìm hiểu thêmTài liệu dành cho nhà phát triển Android:
Tài liệu về Kotlin:
Khác:
Trừ khi có lưu ý khác, nội dung của trang này được cấp phép theo Giấy phép ghi nhận tác giả 4.0 của Creative Commons và các mẫu mã lập trình được cấp phép theo Giấy phép Apache 2.0. Để biết thông tin chi tiết, vui lòng tham khảo Chính sách trang web của Google Developers. Java là nhãn hiệu đã đăng ký của Oracle và/hoặc các đơn vị liên kết với Oracle. [{ "type": "thumb-down", "id": "missingTheInformationINeed", "label":"Thiếu thông tin tôi cần" },{ "type": "thumb-down", "id": "tooComplicatedTooManySteps", "label":"Quá phức tạp/quá nhiều bước" },{ "type": "thumb-down", "id": "outOfDate", "label":"Đã lỗi thời" },{ "type": "thumb-down", "id": "translationIssue", "label":"Vấn đề về bản dịch" },{ "type": "thumb-down", "id": "samplesCodeIssue", "label":"Vấn đề về mẫu/mã" },{ "type": "thumb-down", "id": "otherDown", "label":"Khác" }] [{ "type": "thumb-up", "id": "easyToUnderstand", "label":"Dễ hiểu" },{ "type": "thumb-up", "id": "solvedMyProblem", "label":"Giúp tôi giải quyết được vấn đề" },{ "type": "thumb-up", "id": "otherUp", "label":"Khác" }] |