【发布时间】:2014-01-27 20:06:08
【问题描述】:
我正在使用 Parcelable 类。如何在此类中读取和写入 java.util.Date 对象?
【问题讨论】:
我正在使用 Parcelable 类。如何在此类中读取和写入 java.util.Date 对象?
【问题讨论】:
使用writeSerializable,其中日期是可序列化的。 (但这不是一个好主意。请参阅下面的另一种更好的方法)
@Override
public void writeToParcel(Parcel out, int flags) {
// Write object
out.writeSerializable(date_object);
}
private void readFromParcel(Parcel in) {
// Read object
date_object = (java.util.Date) in.readSerializable();
}
但是序列化操作会消耗很多性能。怎么能克服 这个?
所以更好的用法是在写的时候把日期转换成Long,然后读取Long并传递给Date构造函数获取Date。见下面的代码
@Override
public void writeToParcel(Parcel out, int flags) {
// Write long value of Date
out.writeLong(date_object.getTime());
}
private void readFromParcel(Parcel in) {
// Read Long value and convert to date
date_object = new Date(in.readLong());
}
【讨论】:
在 Kotlin 中,我们可以为 Parcel 创建扩展 - 最简单的解决方案。
fun Parcel.writeDate(date: Date?) {
writeLong(date?.time ?: -1)
}
fun Parcel.readDate(): Date? {
val long = readLong()
return if (long != -1L) Date(long) else null
}
并使用它
parcel.writeDate(date)
parcel.readDate()
【讨论】:
使用 date.getTime() 获取 Long 格式:
public class MiClass implements Parcelable {
Date date;
public MiClass(Date date) {
this.date = date;
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeLong(date != null ? date.getTime() : -1);
}
protected MiClass(Parcel in) {
long tmpDate = in.readLong();
this.date = tmpDate == -1 ? null : new Date(tmpDate);
}
public static final Parcelable.Creator<MiClass> CREATOR = new Parcelable.Creator<MiClass>() {
public MiClass createFromParcel(Parcel source) {
return new MiClass(source);
}
public MiClass[] newArray(int size) {
return new MiClass[size];
}
};
}
【讨论】:
data class DateParcel(val date: Date?):Parcelable {
constructor(parcel: Parcel) : this(parcel.readValue(Date::class.java.classLoader) as? Date
)
override fun writeToParcel(parcel: Parcel, flags: Int) {
parcel.writeValue(date)
}
override fun describeContents(): Int {
return 0
}
companion object CREATOR : Parcelable.Creator<DateParcel> {
override fun createFromParcel(parcel: Parcel): DateParcel {
return DateParcel(parcel)
}
override fun newArray(size: Int): Array<DateParcel?> {
return arrayOfNulls(size)
}
}}
【讨论】:
Date 类实现Serializable...
所以你可以写
parcel.writeSerializable(java.util.Date)
你可以像这样阅读
java.util.Date date = (java.util.Date)parcel.readSerializable();
【讨论】:
试试这个方法::
写::
yourParse.writeSerializable(YourGivenDate)
阅读::
Date myDate = yourParse.readSerializable();
【讨论】: