I'm working with Parcelable class. How can I read and write java.util.Date
object to and from this class?
Use writeSerializable where Date is Serializable. ( But not a good idea. See below for another better way )
@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();
}
But Serializing operations consume much performance. How can overcome this?
So better use is to convert date into Long while writing, and read Long and pass to Date constructor to get Date. See below code
@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());
}
In Kotlin we may create extension for Parcel - the simplest solution.
fun Parcel.writeDate(date: Date?) {
writeLong(date?.time ?: -1)
}
fun Parcel.readDate(): Date? {
val long = readLong()
return if (long != -1L) Date(long) else null
}
And use it
parcel.writeDate(date)
parcel.readDate()
Use date.getTime() for get Long format:
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
class implements Serializable
...
so you can write
parcel.writeSerializable(java.util.Date)
and you can read like
java.util.Date date = (java.util.Date)parcel.readSerializable();
Try this in this way::
for write::
yourParse.writeSerializable(YourGivenDate)
for read::
Date myDate = yourParse.readSerializable();
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.