保存Parcelable数据(Saving Parcelable data)

2019-10-17 23:54发布

我有一个实现Parcelable一类,因为它包含了一些基本的Android类,我不能修改无法实现Serializable。

一些在这个类的对象是例如位置和的PendingIntent(这些都是方便Parcelable)。

我的问题是救了我的主要活动的实例之间的这种信息。

目前,我手里拿的静态引用这个类,效果很好。 但我相信,当我重新安装应用程序,并可能在更新将来到身边,我不能相信,这个静态成员不会被重新初始化。

我试着写这个Parcelable到一个文件,但使用马歇尔()并不总是工作(我收到活页夹不能被整理错误)。

我怎样才能安全地保存这些信息?

谢谢

Answer 1:

我使用的是实行国家控制类来处理的读/写盘:

    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;
        }

    }

}

然后调用公共方法揭开序幕的写入/读取。 对于这个版本,我也有它发生在一个单独的线程,但你可以修改,如果你需要的。



Answer 2:

使用您的示例中的静态导致内存泄漏,而不是做任何事情的好办法。

我建议只有3例使用静态:

  1. 静态最终字符串或INT - 常量
  2. 上内部类(使得它们不包含参考外部类)
  3. 在UTIL或在某些情况下(如CustomFragment.newInstance)工厂方法

现在的问题是,为什么你想坚持的PendingIntent? 它的用例是进程间的通信。



Answer 3:

活页夹

大多数开发商不会直接实现这个类,而不是使用AIDL工具来描述所需的接口,有它产生相应的活页夹的子类。

从官方文档

你需要存储的Binder对象与对象的其余部分? 也许你可以保存你的对象没有Binder的实例,并重新创建的Binder与对象aidl您恢复对象之后



文章来源: Saving Parcelable data