#java #android #parcelable
#java #Android #parcelable
Вопрос:
Я делаю свой объект parcelable, чтобы я мог использовать его с Intent
s. Я получаю NullPointerException
сообщение, когда после получения я читаю содержимое своего объекта. Наиболее точно соответствует содержимому моего ArrayList<String>
. При переборе my ArrayList<String>
он имеет null
значение во всех позициях, следовательно, my NullPointerException
.
Вот мой Parcelable
класс:
public class PhoneBackup implements Parcelable{
public Integer id;
public Long ts;
public String device_name;
public String device_manufacturer;
public String device_model;
public Integer backup_contacts_count;
public String description;
public ArrayList<String> backup_contacts;
public PhoneBackup()
{
}
public PhoneBackup(Parcel pc){
// backup_contacts = new ArrayList<String>(); // Tried this way, still NPE
id = pc.readInt();
ts = pc.readLong();
device_name = pc.readString();
device_manufacturer = pc.readString();
device_model = pc.readString();
backup_contacts_count = pc.readInt();
description = pc.readString();
// pc.readStringList(backup_contacts); // Tried this way, still NPE
backup_contacts = pc.createStringArrayList();
}
// (getters and setters)
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeInt(id);
dest.writeLong(ts);
dest.writeString(device_name);
dest.writeString(device_manufacturer);
dest.writeString(device_model);
dest.writeInt(backup_contacts_count);
dest.writeString(description);
dest.writeList(backup_contacts);
}
/** Static field used to regenerate object, individually or as arrays */
public static final Parcelable.Creator<PhoneBackup> CREATOR = new Parcelable.Creator<PhoneBackup>() {
public PhoneBackup createFromParcel(Parcel pc) {
return new PhoneBackup(pc);
}
public PhoneBackup[] newArray(int size) {
return new PhoneBackup[size];
}
};
Это NullPointerException
с моим backup_contacts
. Но backup_contacts
имеет правильный размер, но содержит все null
, и поскольку мне нужно прочитать содержимое backup_contacts
using get(position)
, я получаю null
значение, а не a String
.
Вопрос в том, почему Parcelable
передаются нулевые значения ArrayList<String>
, а не фактические строки? Как я могу это исправить?
Комментарии:
1. ВСЕГДА включайте logcat в свой вопрос, если вы получаете исключения.
2. Я понимаю ваш комментарий, но трассировка стека была бы здесь совершенно бесполезной, поскольку она указывала на мои методы приложения без упоминания
PhoneBackup
класса, какую часть библиотеки я разработал. Я просто вручную проследил NPEPhoneBackup
до нескольких отладок.
Ответ №1:
Чтобы прочитать список, он должен быть
backup_contacts = new ArrayList<String>();
in.readList(backup_contacts, null);
Вот документация.
В документации для createStringArrayList
говорится:
Считывает и возвращает новый ArrayList, содержащий строковые объекты, из посылки, которая была записана с помощью writeStringList(Список)
Ответ №2:
Я думаю, что проблема может быть в записи в посылку :
dest.writeList(backup_contacts);
должно быть
dest.writeStringList(backup_contacts);
в API уровня 1 добавлен общедоступный конечный список записей с недействительной записью (List val)
Сгладьте список, содержащий строковые объекты, в посылку, при текущей позиции данных () и растущей емкости данных (), если это необходимо. Позже они могут быть получены с помощью createStringArrayList() или readStringList(список).