Сохранение данных 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 случаях:

  1. static final String или int - константы
  2. на внутренних классах (чтобы они не содержали ссылку на внешний класс)
  3. на util или в некоторых случаях (например, CustomFragment.newInstance) фабричные методы

Вопрос в том, почему вы хотите сохранить PendingIntent? Его вариант использования предназначен для межпроцессного взаимодействия.

связующее вещество

Большинство разработчиков не реализуют этот класс напрямую, а вместо этого используют инструмент aidl для описания желаемого интерфейса, заставляя его генерировать соответствующий подкласс Binder.

из официальной документации

Вам нужно хранить Binder объект с остальной частью вашего объекта? Может быть, вы можете сохранить свой объект без Binder экземпляр и воссоздать Binder объект с aidl после восстановления объекта

Другие вопросы по тегам