CÁCH LẤY DỮ LIỆU TỪ WEBSERVICE
Bài này là một phần của khóa học lập trình căn bản Android sử dụng ngôn ngữ Kotlin. Bạn sẽ nhận được nhiều giá trị nhất từ khoá học này nếu bạn làm việc tuần tự qua từng bài học. Tất cả các bài học của khoá học được liệt kê trên trang giới thiệu khóa học lập trình căn bản Android sử dụng ngôn ngữ Kotlin.You watching: Cách lấy dữ liệu từ webserviceBạn đang xem: Cách lấy dữ liệu từ webservice
Bài này là một phần của seri các bài hướng dẫn bạn xây dựng thông qua một ứng dụng để nhận dữ liệu về các tài sản bán trên sao Hỏa. Ứng dụng nhận dữ liệu từ internet và hiển thị dữ liệu trong RecyclerView. Chúng tôi khuyên bạn nên học tất cả các bài theo tuần tự, bởi vì nó được thực hiện thông qua các nhiệm vụ theo từng bước.
Bạn đang xem: Cách lấy dữ liệu từ webservice
Các bài trong seri này:
Giới thiệu
Phần lớn bất kỳ ứng dụng nào bạn xây dựng sẽ cần kết nối với internet ở một số thời điểm. Trong bài này và những bài sau nữa, bạn xây dựng một ứng dụng kết nối đến web service để nhận và hiển thị dữ liệu. Bạn cũng xây dựng những gì bạn học được từ các bài trước về ViewModel, LiveData, và RecyclerView.
Trong bài này, bạn sử dụng các thư viện được cộng đồng phát triển để xây dựng lớp mạng. Điều này giúp đơn giản hóa rất nhiều việc nạp dữ liệu và hình ảnh, và cũng giúp ứng dụng tuân thủ vài trải nghiệm tốt nhất trong Android, chẳng hạn như việc tải các hình ảnh trên luồng background và lưu tạm các hình ảnh được tải. Với các phần không đồng bộ hoặc không bị chặn trong mã, ví dụ như làm việc với lớp web service, bạn sẽ điều chỉnh ứng dụng sử dụng coroutines của Kotlin. Bạn cũng sẽ cập nhật UI của ứng dụng nếu mạng chậm hoặc không có mạng, để cho người dùng biết những gì đang xảy ra.
Bạn nên biết trước những gì
Cách tạo và sử dụng Fragment.Cách điều hướng giữa các Fragment, và sử dụng safeArgs để truyền dữ liệu giữa các Fragment.Cách sử dụng các thành phần kiến trúc bao gồm ViewModel, ViewModelProvider.Factory, LiveData, và các phép biến đổi LiveData.Cách sử dụng coroutines cho các công việc cần thời gian.Bạn sẽ học được gì
REST web service là gì.Bạn sẽ làm được gì
Chỉnh sửa ứng dụng starter để tạo ra một yêu cầu web service API và xử lý các phản hồi.Thực hiện lớp mạng cho ứng dụng sử dụng thư viện Retrofit.Phân tích dữ liệu phản hồi JSON từ web service thành các LiveData trong ứng dụng với việc sử dụng thư viện Moshi.Sử dụng các hỗ trợ của Retrofit cho coroutines để đơn giản hóa mã.Trong bài này ( và các bài sau), bạn sẽ làm việc với ứng dụng starter, gọi là MarsRealEstate, hiển thị các tài sản để bán trên sao Hỏa. Ứng dụng này kết nối với web service để nhận và hiển thị dữ liệu tài sản, bao gồm các thông tin chi tiết như giá và tài sản nào dành cho bán hoặc cho thuê. Các hình ảnh đại diện cho mỗi tài sản là những bức ảnh đời thực từ sao Hỏa được chụp từ các tàu khám phá sao Hỏa của NASA.

Phiên bản ứng dụng bạn xây dựng trong bài này sẽ không có cái nhìn trực quan: nó tập trung vào phần lớp mạng của ứng dụng kết nối với internet và tải các dữ liệu thô về tài sản, sử dụng web service. Để đảm bảo rằng dữ liệu được nhận và phân tích chính xác, bạn sẽ in số lượng tài sản trên sao Hỏa trong một TextView:

Kiến trúc cho ứng dụng MarsRealEstate có hai mô-đun chính:
Một Fragment tổng quan, chứa một màn hình dạng lưới của các hình ảnh tài sản, được xây dựng trong một RecyclerView.Một Fragment chi tiết, chứa thông tin về mỗi tài sản.
Ứng dụng có một ViewModel cho mỗi Fragment. Trong bài này, bạn tạo lớp dịch vụ mạng, và ViewModel giao tiếp trực tiếp với lớp mạng này. Điều này tương tự với những gì bạn đã làm ở bài trước khi ViewModel giao tiếp với cơ sở dữ liệu Room.
ViewModel tổng quan có trách nhiệm gọi đến lớp mạng để nhận thông tin bất động sản trên sao Hỏa. ViewModel chi tiết lưu giữ thông tin chi tiết về một miếng bất động sản được hiển thị trong Fragment chi tiết. Với mỗi ViewModel, bạn sử dụng LiveData với data binding có nhận biết vòng đời để cập nhập lại UI ứng dụng khi dữ liệu thay đổi.
Xem thêm: Cách Tắt Action Center Trong Win 7, Quản Lý Action Center Trong Windows 7
Bạn sử dụng thành phần navigation cho cả việc điều hướng giữa hai Fragment, và cũng truyền tài sản được chọn như là một đối số.See more: Tài Liệu Học Kế Toán Thực Hành Trên Cả Sổ Sách Và Máy Tính, Học Thực Hành Kế Toán Tổng Hợp Thực Tế Tốt Nhất
Bước 1: Khám phá các Fragment và navigation
Xem xét app/java/MainActivity.kt. Ứng dụng sử dụng các Fragment cho cả hai màn hình, vì vậy chỉ có công việc cho Activity là tải layout cho Activity.Xem xét app/res/layout/activity_main.xml. Layout Activity là chủ sở hữu hai Fragment, được định nghĩa trong tệp navigation. Layout này khởi tạo một NavHostFragment và kết hợp với trình quản lý navigation với tài nguyên nav_graph.Mở app/res/navigation/nav_graph.xml. Ở đây bạn có thể thấy mối quan hệ navigation giữa hai Fragment. Navigation graph với điểm bắt đầu là overviewFragment, vì vậy overview Fragment được khởi tạo khi ứng dụng được khởi chạy.Bước 2: Khám phá các tệp mã Kotlin và data binding
Trong khung Project, mở rộng app > java. Lưu ý rằng ứng dụng MarsRealEstate có ba gói thư mục: detail, network, và overview. Ba gói này tương ứng với ba thành phần chính của ứng dụng: Fragment overview và detail, và mã cho lớp mạng.
Mở tệp app/java/overview/OverviewFragment.kt. OverviewFragment khởi tạo OverviewViewModel sau, nghĩa là OverviewViewModel được tạo ở lần đầu tiên nó được sử dụng. Xem xét phương thức onCreateView(). Phương thức này lồng layout fragment_overview sử dụng data binding, thiết lập chủ sở hữu vòng đời với chính nó (this), và gán biến viewModel trong đối tượng binding của nó. Bởi vì bạn gán chủ sở hữu vòng đời, bất kỳ LiveData được sử dụng trong data binding sẽ tự động được theo dõi bất cứ sự thay đổi nào, và UI sẽ tự động cập nhật lại tương ứng.Mở tệp app/java/overview/OverviewViewModel. Bởi vì các phản hồi là một LiveData và bạn gán vòng đời cho biến binding, bất cứ thay đổi nào sẽ được cập nhật trên UI của ứng dụng.Xem xét khối init. Khi ViewModel được tạo, nó gọi phương thức getMarsRealEstateProperties().Xem xét phương thức getMarsRealEstateProperties(). Trong ứng dụng starter, phương thức này chứa một phản hồi giữ chỗ. Mục đích bài này là cập nhật lại phản hồi LiveData bên trong ViewModel sử dụng dữ liệu thực mà bạn nhận từ internet.Mở tệp app/res/layout/fragment_overview.xml. Đây là layout cho Fragment overview mà bạn sẽ làm việc trong bài này, và nó bao gồm cả data binding cho ViewModel. Nó khái báo OverviewViewModel và sau đó liên kết các phản hồi từ ViewModel vào TextView. Trong các bài sau, bạn thay thế TextView bằng một dạng lưới các hình ảnh trong một RecyclerView.Biên dịch và chạy ứng dụng. Tất cả những gì bạn thấy trong phiên bản hiện tại của ứng dụng là phản hồi - "Set the Mars API Response here!"

Dữ liệu bất động sản sao Hỏa được lưu trữ trên một web server, như một REST web service. Web service sử dụng kiến trúc REST, được xây dựng sử dụng các thành phần và giao thức web cơ bản.
Bạn tạo một yêu cầu đến web service trong cách tiêu chuẩn thông qua các URI. URL web quen thuộc thực tế cũng là một loại của URI, và cả hai đều được sử dụng thay thế cho nhau trong suốt khóa này. Ví dụ, trong ứng dụng cho bài này, bạn nhận được tất cả dữ liệu từ server sau đây:
https://android-kotlin-fun-mars-server.appspot.com
Nếu bạn gõ URL sau đây vào trình duyệt của bạn, bạn sẽ nhận được một danh sách các tài sản bất động sản có sẵn trên sao Hỏa!
https://android-kotlin-fun-mars-server.appspot.com/realestate
Phản hồi từ một web service là các định dạng phổ biến trong JSON, một định dạng trao đổi thể hiện cho dữ liệu có cấu trúc. Bạn tìm hiểu thêm về JSON trong nhiệm vụ tiếp theo, nhưng đại khái, đối tượng JSON là một tập hợp các cặp khóa-giá trị, thỉnh thoảng được gọi là dictionary, một hashmap, hoặc mảng kết hợp. Một tập hợp các đối tượng JSON là một mảng JSON, và bạn nhận được mảng này dưới dạng một phản hồi từ web service.
Để nhận dữ liệu này vào trong ứng dụng, ứng dụng cần thiết lập kết nối mạng và trao đổi với server đó, và sau đó nhận và phân tích dữ liệu phản hồi vào trong một định dạng mà ứng dụng có thể sử dụng. Trong bài này, bạn sử dụng một thư viện REST, được gọi Retrofit để tạo ra kết nối này.
Bước 1: Thêm Retrofit dependencies vào Gradle
Mở tệp build.gradle (Module: app).Trong phần dependencies, thêm vào các dòng sau đây cho các thư viện Retrofit:implementation "com.squareup.retrofit2:retrofit:$version_retrofit"implementation "com.squareup.retrofit2:converter-scalars:$version_retrofit"Lưu ý rằng số phiên bản được định nghĩa riêng trong tệp Gradle của dự án. Dependency thứ nhất là cho thư viện Retrofit 2, và dependency thứ hai là cho trình chuyển đổi Retrofit không xác định. Trình chuyển đổi này cho phép Retrofit trả về kết quả JSON như một chuỗi String. Hai thư viện này làm việc cùng nhau.
Nhấn Sync Now để biên dịch lại dự án với các dependency mới.Bước 2: Triển khai một MarsAPIService
Retrofit tạo một API cho ứng dụng dựa trên nội dung từ web service. Nó nạp dữ liệu từ web service và đưa nó qua một thư viện chuyển đổi riêng biệt, mà biết cách để phân tích dữ liệu và trả về dưới dạng các đối tượng hữu ích. Retrofit bao gồm các hỗ trợ được tích hợp cho các định dạng dữ liệu web phổ biến như XML và JSON. Retrofit tạo hầu hết các lớp mạng cho bạn, bao gồm các chi tiết quan trọng như việc thực hiện các yêu cầu trên các luồng dưới background.
Xem thêm: Cách Pha Bột Nghệ Để Uống Tinh Bột Nghệ Tốt Cho Cơ Thể, Uống Tinh Bột Nghệ Đúng Cách Như Thế Nào
Lớp MarsApiService lưu giữ lớp mạng cho ứng dụng, đó là, API mà ViewModel sẽ sử dụng để giao tiếp với web service. Đây là lớp mà bạn cần thực hiện các API dịch vụ Retrofit.See more: 5 Bước Xây Dựng Quy Trình Bán Hàng Của Công Ty Sản Xuất, Sơ Đồ Quy Trình Kinh Doanh Của Công Ty Thương Mại
Mở tệp app/java/network/MarsApiService.kt. Ngay bây giờ tệp này chỉ chứa một thứ: một hằng cho URL cơ sở cho web service.Ngay sau dưới việc gọi đến builder Retrofit, định nghĩa một giao diện (interface) để định nghĩa cách Retrofit làm việc với web server sử dụng các yêu cầu HTTP. Khai báo retrofit2.http.GET và retrofit2.Call khi được yêu cầu.interface MarsApiService {