2012-03-28 21 views
10

Cho đến nay tôi đã chugging cùng với Parcelable đối tượng không có vấn đề, chủ yếu là vì tất cả các thành viên của họ là loại có writeX() phương pháp liên kết với chúng. Ví dụ, tôi làm:Viết đối tượng thành viên tới bưu kiện

public String name; 

private Foo(final Parcel in) { 
    name = in.readString(); } 
public void writeToParcel(final Parcel dest, final int flags) { 
    dest.writeString(name); } 

Nhưng bây giờ nếu tôi có một Bar điều thành viên có được một chút dicey cho tôi:

public Bar bar; 

private Foo(final Parcel in) { 
    bar = new Bar(); //or i could actually write some constructor for Bar, this is a demo. 
    bar.memberString = in.readString(); 
} 

public void writeToParcel(final Parcel dest, final int flags) { 
    // What do I do here? 
} 

Tôi tiếp cận này một cách sai lầm? Tôi nên làm gì trong số writeToParcel của mình cho thành viên bưu kiện Bar s?

Trả lời

25

Cách chính xác và nhiều hơn nữa là làm cho Bar thực hiện Bưu kiện quá.

Để đọc Bar trong constructor Foo tin của bạn:

private Foo(final Parcel in) { 
    ... ... 
    bar = in.readParcelable(getClass().getClassLoader()); 
    ... ... 
} 

Để viết Bar trong phương pháp writeToParcel của bạn:

public void writeToParcel(final Parcel dest, final int flags) { 
    ... ... 
    dest.writeParcelable(bar, flags); 
    ... ... 
} 

Hope this helps.

+2

thêm vì một số có thể gây nhầm lẫn ở đây ** getClass(). GetClassLoader() ** có nghĩa là ** Bar.class.getClassLoader() ** – Juni

+0

Tôi nên làm gì nếu lớp của mình được SDK cung cấp và không thể sửa đổi ? – Eido95

0

Parceables là một nỗi đau và chỉ vượt qua theo giá trị và không tham chiếu. Tôi sẽ không bao giờ khuyên bạn nên sử dụng chúng. Tạo một cá thể mô hình tĩnh nếu bạn áp dụng và chỉ nhận được một tham chiếu shim đến đối tượng mà bạn cần.

+0

Từ ngữ của một người khôn ngoan –

+0

Sử dụng các trình đơn như một nguyên tắc thiết kế là thiếu sót trong lập trình hướng đối tượng. Deserialize vào json hoặc lưu trữ các giá trị, không có một lớp toàn cầu tất cả các lớp khác của bạn có thể truy cập. – HarshMarshmallow