Java 如何避免在android中为每个类实现Parcelable,以便将其用于放置额外的数组列表
是否可以一次实现一个Parcelable类并将其用于所有其他类,以便在活动之间传递带有put extra array list的列表?是,带有反射Java 如何避免在android中为每个类实现Parcelable,以便将其用于放置额外的数组列表,java,android,arraylist,parcelable,parcel,Java,Android,Arraylist,Parcelable,Parcel,是否可以一次实现一个Parcelable类并将其用于所有其他类,以便在活动之间传递带有put extra array list的列表?是,带有反射 import android.os.Parcel; import android.os.Parcelable; import android.util.Log; import java.lang.reflect.Field; import java.util.ArrayList; public class ParcelableEntity imp
import android.os.Parcel;
import android.os.Parcelable;
import android.util.Log;
import java.lang.reflect.Field;
import java.util.ArrayList;
public class ParcelableEntity implements Parcelable {
private static final String TAG = "ParcelableEntity";
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel destination, int flags) {
destination.writeString(this.getClass().getCanonicalName());
for (Field field : this.getClass().getDeclaredFields()) {
try {
field.setAccessible(true);
if (field.getType().equals(java.util.List.class)) {
destination.writeList((ArrayList) field.get(this));
} else
destination.writeValue(field.get(this));
} catch (Exception err) {
Log.w(TAG, err.toString());
}
}
}
public static final Creator CREATOR = new Creator() {
public ParcelableEntity createFromParcel(Parcel source) {
try {
Object entity = Class.forName((source.readString())).newInstance();
for (Field field : entity.getClass().getDeclaredFields()) {
try {
field.setAccessible(true);
if (field.getType().equals(java.util.List.class)) {
ArrayList list = new ArrayList();
source.readList(list, Class.forName(field.getDeclaringClass().getName()).getClassLoader());
field.set(entity, list);
} else
field.set(entity, source.readValue(field.getType().getClassLoader()));
} catch (Exception err) {
Log.w(TAG, err.toString());
}
}
return (ParcelableEntity) entity;
} catch (Exception err) {
return null;
}
}
public ParcelableEntity[] newArray(int size) {
return new ParcelableEntity[size];
}
};
}
现在你应该在课堂上扩展它
public class Book extends ParcelableEntity {
public Long id;
public String name;
}
然后使用它
public void onClick(View view) {
ArrayList<book> lstBook = new ArrayList<>();
Book b1 = new Book();
b1.id = 1L;
b1.name = "test 1";
lstBook.add(b1);
Book b2 = new Book();
b2.id = 2L;
b2.name = "test 2";
lstBook.add(b2);
Intent intent = new Intent(MainActivity.this, SecondActivity.class);
intent.putParcelableArrayListExtra("TEST", lstBook);
startActivity(intent);
}
public void onClick(视图){
ArrayList lstBook=新的ArrayList();
书b1=新书();
b1.id=1L;
b1.name=“测试1”;
增加(b1);
图书b2=新书();
b2.id=2L;
b2.name=“测试2”;
新增(b2);
意向意向=新意向(MainActivity.this,SecondActivity.class);
意图。putParcelableArrayListExtra(“测试”,lstBook);
星触觉(意向);
}
是,带有反射
import android.os.Parcel;
import android.os.Parcelable;
import android.util.Log;
import java.lang.reflect.Field;
import java.util.ArrayList;
public class ParcelableEntity implements Parcelable {
private static final String TAG = "ParcelableEntity";
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel destination, int flags) {
destination.writeString(this.getClass().getCanonicalName());
for (Field field : this.getClass().getDeclaredFields()) {
try {
field.setAccessible(true);
if (field.getType().equals(java.util.List.class)) {
destination.writeList((ArrayList) field.get(this));
} else
destination.writeValue(field.get(this));
} catch (Exception err) {
Log.w(TAG, err.toString());
}
}
}
public static final Creator CREATOR = new Creator() {
public ParcelableEntity createFromParcel(Parcel source) {
try {
Object entity = Class.forName((source.readString())).newInstance();
for (Field field : entity.getClass().getDeclaredFields()) {
try {
field.setAccessible(true);
if (field.getType().equals(java.util.List.class)) {
ArrayList list = new ArrayList();
source.readList(list, Class.forName(field.getDeclaringClass().getName()).getClassLoader());
field.set(entity, list);
} else
field.set(entity, source.readValue(field.getType().getClassLoader()));
} catch (Exception err) {
Log.w(TAG, err.toString());
}
}
return (ParcelableEntity) entity;
} catch (Exception err) {
return null;
}
}
public ParcelableEntity[] newArray(int size) {
return new ParcelableEntity[size];
}
};
}
现在你应该在课堂上扩展它
public class Book extends ParcelableEntity {
public Long id;
public String name;
}
然后使用它
public void onClick(View view) {
ArrayList<book> lstBook = new ArrayList<>();
Book b1 = new Book();
b1.id = 1L;
b1.name = "test 1";
lstBook.add(b1);
Book b2 = new Book();
b2.id = 2L;
b2.name = "test 2";
lstBook.add(b2);
Intent intent = new Intent(MainActivity.this, SecondActivity.class);
intent.putParcelableArrayListExtra("TEST", lstBook);
startActivity(intent);
}
public void onClick(视图){
ArrayList lstBook=新的ArrayList();
书b1=新书();
b1.id=1L;
b1.name=“测试1”;
增加(b1);
图书b2=新书();
b2.id=2L;
b2.name=“测试2”;
新增(b2);
意向意向=新意向(MainActivity.this,SecondActivity.class);
意图。putParcelableArrayListExtra(“测试”,lstBook);
星触觉(意向);
}
与其使用反射,不如序列化为JSON字符串(使用GSON库)并反序列化到目标类上的对象。与其使用反射,不如序列化为JSON字符串(使用GSON库)并反序列化到目标类上的对象。不要对抗系统。使用反射或JSON会影响性能。继续使用Parcelable,使用帮助网站,如Android Studio插件,如不要与系统对抗。使用反射或JSON会影响性能。继续使用Parcelable,使用一个助手网站,比如Android Studio插件,比如这比GSON serialize快。我测试它。你也可以。这比GSON serialize快。我测试它。你也可以。对于少于10000条记录,我认为反射足够好。对于少于10000条记录,我认为反射足够好。