Một Tính Năng Tuyệt Vời Trong Model của Kotlin
Bài đăng này đã không được cập nhật trong 3 năm
Một chức năng không thể thiếu khi lập trình Android mà ai cũng phải biết đó là truyền Object References và chỉ sử dụng được khi nó được đặt trong bundle hoặc Intent để truyền dữ liệu object giữa các activity hoặc fragment. Và chỉ có 2 lựa chọn để làm việc này là Serializable hoặc Parcelble. Nó được sử dụng rộng rãi và rất phổ biến nhưng có một vấn đề sinh ra là nếu một lớp của bạn có quá nhiều biến và code sinh ra quá nhiều dòng. Nó sẽ gây ra sự phức tạp và khó kiểm soát code của bạn. Và vì chính điều này nên tôi sẽ giới thiệu đến các bạn một tính năng tuyệt vời để xử lý vấn đề này trong Kotlin.
Parcelize
Tồi sẽ nói về Parcelable vì nó là thứ mà tôi và tất cả các lập trình viên khác đều ưu tiên sử dụng. Về Serializable thì nó được thực hiện rất đơn giản nhưng nó làm việc chậm và cơ chế làm việc của nó dễ dẫn đến tình trạng leak Memory. Nhưng đối với Parcelable thì nó nhanh hơn rất nhiều và cơ chế làm việc rất hiệu quả nhưng bù lại nó cần thêm một lượng code dài để thực thi nó và gây ra tình trạng khó đọc class.
Trong phiên bảng 1.1.4 thì Kotlin đã hỗ trợ Plugin Tiện ích mở rộng thực hiện quá trình Parcelable tự động. Bạn chỉ cần khai báo các thuộc tính cần được serialized trong một constructor và thêm @Parcelize
vào phần chú thích và writeToParcel()
/ createFromParcel()
thì method sẽ được tự động tạo.
Mô hình trong Java và trong Kotlin
Tôi sẽ tạo ra hai mẫu của cùng một lớp SinhVien với Java và Kotlin sử dụng Parcelable
Sinhvien.java
public class SinhVien implements Parcelable {
private int maSV;
private String tenSV;
private String lop;
private String diaChi;
public SinhVien(int maSV, String tenSV, String lop, String diaChi) {
this.maSV = maSV;
this.tenSV = tenSV;
this.lop = lop;
this.diaChi = diaChi;
}
protected SinhVien(Parcel in) {
maSV = in.readInt();
tenSV = in.readString();
lop = in.readString();
diaChi = in.readString();
}
public static final Creator<SinhVien> CREATOR = new Creator<SinhVien>() {
@Override
public SinhVien createFromParcel(Parcel in) {
return new SinhVien(in);
}
@Override
public SinhVien[] newArray(int size) {
return new SinhVien[size];
}
};
public int getMaSV() {
return maSV;
}
public void setMaSV(int maSV) {
this.maSV = maSV;
}
public String getTenSV() {
return tenSV;
}
public void setTenSV(String tenSV) {
this.tenSV = tenSV;
}
public String getLop() {
return lop;
}
public void setLop(String lop) {
this.lop = lop;
}
public String getDiaChi() {
return diaChi;
}
public void setDiaChi(String diaChi) {
this.diaChi = diaChi;
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel parcel, int i) {
parcel.writeInt(maSV);
parcel.writeString(tenSV);
parcel.writeString(lop);
parcel.writeString(diaChi);
}
}
Sinhvien.kt
@Parcelize
data class Sinhvien(val maSV: Int, val tenSV: String, val lop: String, val diaChi: String) : Parcelable
Điều kiện cần có
Kotlin phiên bản 1.1.4 trở lên
Cách thực hiện
Thêm đoạn mã dưới đây vào file build.gradle
androidExtensions {
experiment = true
}
Bạn cũng cần thêm plugin: 'kotlin-android-extensions' vào tệp gradle của bạn. Tuy nhiên, nếu bạn đã tạo ra dự án của bạn bằng cách sử dụng hỗ trợ Kotlin, nó sẽ được thêm tự động. Sau đó, thêm @Parcelize chú thích vào mô hình của bạn. Và tất cả chỉ cần như vậy.
Trường hợp lỗi Lint
Android Studio cho lỗi Lint bên dưới tên class . Đó là một lỗi báo cáo cho IntelliJ. Bạn có thể khắc phục nó dựa vào đây : https://youtrack.jetbrains.com/issue/KT-19300
Nguồn : https://android.jlelse.eu/yet-another-awesome-kotlin-feature-parcelize-5439718ba220
All rights reserved