Возможно ли однажды реализовать Parcelable-класс и использовать его для всех других классов, чтобы передавать списки с дополнительным добавлением список массивов между действиями?Как избавиться от реализации Parcelable для каждого класса в android, чтобы использовать его для добавления лишнего списка массивов
ответ
Да, с отражением.
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);
}
Вместо-использования отражения не лучше Сериализация в JSON строку (с использованием Библиотека GSON) и де-сериализуется в Object в классе назначения.
Не боритесь с системой. Использование Reflection или JSON влияет на производительность. Идем дальше с помощью Parcelable и используем вспомогательный сайт, например, http://www.parcelabler.com/ или плагин для Android Studio, например https://github.com/mcharmas/android-parcelable-intellij-plugin
Для менее чем 10 000 записей, думаю, отражение достаточно хорошее. – farhad2161
Это быстрее, чем GSON serialize.I проверю его. Вы тоже можете. – farhad2161