Làm việc với đối tượng dữ liệu quan sát được

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đố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:

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&lt;String, Object&gt;"/>
</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&lt;Object&gt;"/>
</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 StateFlowLiveData. Để 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 StateFlowViewModel 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