Сохранение данных Parcelable
У меня есть класс, который реализует Parcelable, и не может реализовать Serializable, потому что он содержит некоторые базовые классы Android, которые я не могу изменить.
Некоторыми объектами в этом классе являются, например, Location и PendingIntent (которые все удобно Parcelable).
Моя проблема заключается в сохранении этой информации между экземплярами моей основной деятельности.
В настоящее время я держу статическую ссылку на этот класс, который работает хорошо. Но я предполагаю, что когда я переустановлю приложение и, возможно, когда появятся обновления, я не смогу поверить, что этот статический член не будет повторно инициализирован.
Я пытался записать этот Parcelable в файл, но использование marshall() не всегда работает (я получаю, что ошибка Binder не может быть упорядочена).
Как я могу безопасно сохранить эту информацию?
Спасибо
3 ответа
Я использую класс StateControl для обработки чтения / записи на диск:
public class StateControl {
Context mContext;
Thread worker;
WriteObjectToFile writer;
// StateControl Constructor
public StateControl(Context context) {
mContext = context;
// Construct a writer to hold and save the data
writer = new WriteObjectToFile();
// Construct a worker thread to handle the writer
worker = new Thread(writer);
}// end of StateControl constructor
// Method to save the global data
public void saveObjectData(Object object, String key) {
if (object == null){
// I had a different action here
} else {
// Write the data to disc
writer.setParams(new WriteParams(object, key));
worker.run();
}
}// end of saveGlobalData method
// Method to read the Global Data
public Object readObjectData(String key){
Object returnData = (Object) readObjectFromFile(key);
if (returnData == null){
// I had a different action here
} else {
return returnData;
}
}// end of readGlobalData method
// Method to erase the Global data
public void clearObjectData(String key){
writer.setParams(new WriteParams(null, key));
worker.run();
}// end of clearGlobalData method
private class WriteObjectToFile implements Runnable {
WriteParams params;
public void setParams(WriteParams params) {
this.params = params;
}
public void run() {
writeObjectToFile(params.getObject(), params.getFilename());
}
private boolean writeObjectToFile(Object object, String filename) {
boolean success = true;
ObjectOutputStream objectOut = null;
try {
FileOutputStream fileOut = mContext.openFileOutput(filename, Activity.MODE_PRIVATE);
objectOut = new ObjectOutputStream(fileOut);
objectOut.writeObject(object);
fileOut.getFD().sync();
} catch (IOException e) {
success = false;
e.printStackTrace();
} finally {
if (objectOut != null) {
try {
objectOut.close();
} catch (IOException e) {
// do nothing
}
}// end of if
}// End of try/catch/finally block
return success;
}
}// end of writeObjectToFile method
private Object readObjectFromFile(String filename) {
ObjectInputStream objectIn = null;
Object object = null;
try {
FileInputStream fileIn = mContext.getApplicationContext().openFileInput(filename);
objectIn = new ObjectInputStream(fileIn);
object = objectIn.readObject();
} catch (FileNotFoundException e) {
// Do nothing
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} finally {
if (objectIn != null) {
try {
objectIn.close();
} catch (IOException e) {
// do nowt
}
}
}
return object;
}
private static class WriteParams {
Object object;
String filename;
public WriteParams(Object object, String filename) {
super();
this.object = object;
this.filename = filename;
}
public Object getObject() {
return object;
}
public String getFilename() {
return filename;
}
}
}
Затем вызовите публичные методы, чтобы начать запись / чтение. Для этой версии у меня также это происходит в отдельном потоке, но вы можете изменить это, если вам нужно.
Использование статического в вашем примере приводит к утечкам памяти и не является хорошим способом сделать что-либо.
Я предлагаю использовать статический только в 3 случаях:
- static final String или int - константы
- на внутренних классах (чтобы они не содержали ссылку на внешний класс)
- на util или в некоторых случаях (например, CustomFragment.newInstance) фабричные методы
Вопрос в том, почему вы хотите сохранить PendingIntent? Его вариант использования предназначен для межпроцессного взаимодействия.
связующее вещество
Большинство разработчиков не реализуют этот класс напрямую, а вместо этого используют инструмент aidl для описания желаемого интерфейса, заставляя его генерировать соответствующий подкласс Binder.
Вам нужно хранить Binder
объект с остальной частью вашего объекта? Может быть, вы можете сохранить свой объект без Binder
экземпляр и воссоздать Binder
объект с aidl
после восстановления объекта