Khả năng ghi nhận đề cập đến khả năng của một đối tượng thông báo cho người khác về các thay đổi về dữ liệu. Thư viện liên kết dữ liệu cho phép bạn tạo đối tượng, trường hoặc tập hợp có thể quan sát được.
Bạn có thể sử dụng bất kỳ đối tượng nào để liên kết dữ liệu, nhưng việc sửa đổi đối tượng thì không tự động làm cho giao diện người dùng cập nhật. Bạn có thể sử dụng liên kết dữ liệu để cung cấp dữ liệu các đối tượng có khả năng thông báo cho các đối tượng khác (được gọi là trình nghe) khi những thay đổi về dữ liệu của họ. Có 3 loại lớp quan sát được: trường, bộ sưu tập và đối tượng.
Khi một trong các đối tượng dữ liệu có thể quan sát này được liên kết với giao diện người dùng và một thuộc tính của thì đối tượng dữ liệu thay đổi, giao diện người dùng sẽ tự động cập nhật.
Các trường có thể quan sát được
Nếu các lớp của bạn chỉ có một vài thuộc tính, thì có thể bạn không cần
tạo các lớp triển khai
Giao diện Observable
. Trong phần này
trong trường hợp này, bạn có thể sử dụng lớp Observable
chung và các lệnh sau
các lớp cụ thể nguyên gốc để làm cho các trường có thể quan sát được:
ObservableBoolean
ObservableByte
ObservableChar
ObservableShort
ObservableInt
ObservableLong
ObservableFloat
ObservableDouble
ObservableParcelable
Trường có thể quan sát là các đối tượng có thể quan sát độc lập có một
. Các phiên bản gốc tránh tạo và mở hộp trong quá trình truy cập
các toán tử. Để sử dụng cơ chế này, hãy tạo một thuộc tính public final
trong Java
ngôn ngữ lập trình hoặc thuộc tính chỉ đọc trong Kotlin, như minh hoạ trong
ví dụ sau:
Kotlin
class User { val firstName = ObservableField<String>() val lastName = ObservableField<String>() val age = ObservableInt() }
Java
private static class User { public final ObservableField<String> firstName = new ObservableField<>(); public final ObservableField<String> lastName = new ObservableField<>(); public final ObservableInt age = new ObservableInt(); }
Để truy cập vào giá trị của trường, hãy sử dụng
set()
và
Phương thức truy cập get()
hoặc dùng thuộc tính Kotlin
cú pháp:
Kotlin
user.firstName = "Google" val age = user.age
Java
user.firstName.set("Google"); int age = user.age.get();
Bộ sưu tập có thể quan sát
Một số ứng dụng dùng cấu trúc động để lưu giữ dữ liệu. Các bộ sưu tập có thể quan sát được cho phép
truy cập vào các cấu trúc này bằng cách sử dụng một khoá. Chiến lược phát hành đĩa đơn
Lớp ObservableArrayMap
rất hữu ích khi khoá là loại tham chiếu, chẳng hạn như String
, như minh hoạ trong
ví dụ sau:
Kotlin
ObservableArrayMap<String, Any>().apply { put("firstName", "Google") put("lastName", "Inc.") put("age", 17) }
Java
ObservableArrayMap<String, Object> user = new ObservableArrayMap<>(); user.put("firstName", "Google"); user.put("lastName", "Inc."); user.put("age", 17);
Trong bố cục, bạn có thể tìm thấy bản đồ bằng cách sử dụng các khoá chuỗi, như minh hoạ trong ví dụ sau:
<data>
<import type="android.databinding.ObservableMap"/>
<variable name="user" type="ObservableMap<String, Object>"/>
</data>
…
<TextView
android:text="@{user.lastName}"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<TextView
android:text="@{String.valueOf(1 + (Integer)user.age)}"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
ObservableArrayList
lớp rất hữu ích khi khoá là một số nguyên, như sau:
Kotlin
ObservableArrayList<Any>().apply { add("Google") add("Inc.") add(17) }
Java
ObservableArrayList<Object> user = new ObservableArrayList<>(); user.add("Google"); user.add("Inc."); user.add(17);
Trong bố cục, bạn có thể truy cập danh sách thông qua các chỉ mục, như minh hoạ trong ví dụ sau:
<data>
<import type="android.databinding.ObservableList"/>
<import type="com.example.my.app.Fields"/>
<variable name="user" type="ObservableList<Object>"/>
</data>
…
<TextView
android:text='@{user[Fields.LAST_NAME]}'
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<TextView
android:text='@{String.valueOf(1 + (Integer)user[Fields.AGE])}'
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
Đối tượng có thể quan sát
Một lớp triển khai giao diện Observable
cho phép đăng ký
những trình nghe muốn được thông báo về những thay đổi đối với thuộc tính từ dữ liệu có thể ghi nhận được
.
Giao diện Observable
có cơ chế thêm và xoá trình nghe, nhưng bạn
quyết định thời điểm gửi thông báo. Để giúp cho việc phát triển trở nên dễ dàng hơn, Dữ liệu
Thư viện liên kết cung cấp
Lớp BaseObservable
triển khai cơ chế đăng ký trình nghe. Lớp dữ liệu triển khai
BaseObservable
chịu trách nhiệm thông báo khi các thuộc tính thay đổi. Việc cần làm
thao tác này, chỉ định một chú thích Bindable
vào phương thức getter và gọi phương thức
notifyPropertyChanged()
trong phương thức setter, như minh hoạ trong ví dụ sau:
Kotlin
class User : BaseObservable() { @get:Bindable var firstName: String = "" set(value) { field = value notifyPropertyChanged(BR.firstName) } @get:Bindable var lastName: String = "" set(value) { field = value notifyPropertyChanged(BR.lastName) } }
Java
private static class User extends BaseObservable { private String firstName; private String lastName; @Bindable public String getFirstName() { return this.firstName; } @Bindable public String getLastName() { return this.lastName; } public void setFirstName(String firstName) { this.firstName = firstName; notifyPropertyChanged(BR.firstName); } public void setLastName(String lastName) { this.lastName = lastName; notifyPropertyChanged(BR.lastName); } }
Tính năng liên kết dữ liệu sẽ tạo một lớp có tên là BR
trong gói mô-đun, trong đó có
mã nhận dạng của tài nguyên dùng để liên kết dữ liệu. Chú giải Bindable
tạo một mục trong tệp lớp BR
trong quá trình biên dịch. Nếu lớp cơ sở
đối với lớp dữ liệu không thay đổi được, bạn có thể triển khai giao diện Observable
sử dụng
PropertyChangeRegistry
để đăng ký và thông báo cho trình nghe một cách hiệu quả.
Đối tượng nhận biết vòng đời
Bố cục trong ứng dụng của bạn cũng có thể liên kết với các nguồn liên kết dữ liệu tự động thông báo cho giao diện người dùng về các thay đổi trong dữ liệu. Bằng cách đó, các liên kết của bạn nhận biết được vòng đời và chỉ được kích hoạt khi giao diện người dùng hiển thị trên màn hình.
Hỗ trợ liên kết dữ liệu
StateFlow
và
LiveData
. Để biết thêm thông tin về
sử dụng LiveData
trong liên kết dữ liệu, hãy xem bài viết Sử dụng LiveData để thông báo cho giao diện người dùng về dữ liệu
thay đổi.
Sử dụng StateFlow
Nếu ứng dụng của bạn dùng Kotlin thông qua coroutine, bạn có thể dùng
Các đối tượng StateFlow
làm nguồn liên kết dữ liệu. Cách sử dụng đối tượng StateFlow
với
lớp liên kết của bạn, chỉ định chủ sở hữu vòng đời để xác định phạm vi của
Đối tượng StateFlow
. Ví dụ sau đây chỉ định hoạt động dưới dạng
chủ sở hữu vòng đời sau khi lớp liên kết được tạo thực thể:
class ViewModelActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
// Inflate view and obtain an instance of the binding class.
val binding: UserBinding = DataBindingUtil.setContentView(this, R.layout.user)
// Specify the current activity as the lifecycle owner.
binding.lifecycleOwner = this
}
}
Như mô tả trong bài viết Chế độ xem bố cục liên kết đến Cấu trúc
Thành phần, liên kết dữ liệu
hoạt động liền mạch với ViewModel
. Bạn có thể sử dụng kết hợp StateFlow
và ViewModel
như sau:
class ScheduleViewModel : ViewModel() {
private val _username = MutableStateFlow<String>("")
val username: StateFlow<String> = _username
init {
viewModelScope.launch {
_username.value = Repository.loadUserName()
}
}
}
Trong bố cục, hãy chỉ định các thuộc tính và phương thức của đối tượng ViewModel
cho
các khung hiển thị tương ứng sử dụng biểu thức liên kết, như minh hoạ sau
ví dụ:
<TextView
android:id="@+id/name"
android:text="@{viewmodel.username}" />
Giao diện người dùng tự động cập nhật bất cứ khi nào giá trị tên của người dùng thay đổi.
Tắt tính năng hỗ trợ StateFlow
Đối với các ứng dụng sử dụng Kotlin và AndroidX, khả năng hỗ trợ StateFlow
sẽ tự động
đi kèm với liên kết dữ liệu. Điều này có nghĩa là phần phụ thuộc coroutine
tự động được đưa vào ứng dụng của bạn nếu phần phụ thuộc chưa có sẵn.
Bạn có thể chọn không sử dụng chức năng này bằng cách thêm thông tin sau vào
Tệp build.gradle
:
Groovy
android { ... dataBinding { addKtx = false } }
Kotlin
android { ... dataBinding { addKtx = false } }
Ngoài ra, bạn có thể tắt StateFlow
trên toàn cục trong dự án của mình bằng cách thêm
dòng sau vào tệp gradle.properties
:
Groovy
android.defaults.databinding.addKtx = false
Kotlin
android.defaults.databinding.addKtx = false
Tài nguyên khác
Để tìm hiểu thêm về liên kết dữ liệu, hãy tham khảo các tài nguyên sau đây:
Mẫu
Lớp học lập trình
Bài đăng trên blog
Đề xuất cho bạn
- Lưu ý: văn bản có đường liên kết sẽ hiện khi JavaScript tắt
- Mô-đun trạng thái đã lưu cho ViewModel
- Liên kết khung hiển thị bố cục với thành phần cấu trúc
- Tổng quan về thư viện Paging