12/08/2018, 16:36

Một Tính Năng Tuyệt Vời Trong Model của Kotlin

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ó ...

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

0