Interfaz parcelable

http://www.cnblogs.com/renqingping/archive/2012/10/25/Parcelable.html

Conocimientos adquiridos en el proyecto EGou: dirección del proyecto http://www.apkbus.com/forum.php?mod=viewthread&tid=270126&extra=page%3D1%26filter%3Dsortid%26sortid%3D12


1. Interfaz parcelable



Interfaz para clases cuyas instancias se pueden escribir y restaurar desde una parcela. Las clases que implementan la interfaz Parcelable también deben tener un campo estático llamado CREATOR, que es un objeto que implementa la interfaz Parcelable.Creator.


2. La realización de Parcelable es para serialización, entonces, ¿por qué serialización?


1) Guarde permanentemente el objeto y guarde la secuencia de bytes del objeto en un archivo local;


2) Transfiera el objeto a


través de la red mediante serialización ; 3) Transfiera el objeto entre procesos mediante serialización.


3. Métodos


para implementar la serialización Hay dos opciones para la serialización en Android: una es implementar la interfaz serializable (que es compatible con el propio JavaSE) y la otra es implementar la interfaz Parcelable (que es una función única de Android, y es más eficiente que implementar la interfaz serializable). Para la transferencia de datos por intención, también se puede utilizar para la comunicación entre procesos (IPC). Implementar la interfaz Serializable es muy simple, solo declararlo, mientras que implementar la interfaz Parcelable es un poco más complicado, pero es más eficiente, este método se recomienda para mejorar el rendimiento.


Nota: Hay dos métodos para que Intent transfiera objetos en Android: uno es Bundle.putSerializable (clave, objeto) y el otro es Bundle.putParcelable (clave, objeto). Por supuesto, estos Objetos tienen ciertas condiciones: el primero implementa la interfaz Serializable, mientras que el segundo implementa la interfaz Parcelable.


4. El principio de elegir el método de serialización


1) Cuando se usa memoria, Parcelable tiene un rendimiento más alto que Serializable, por lo que se recomienda usar Parcelable.


2) Serializable generará una gran cantidad de variables temporales durante la serialización, lo que provocará GC frecuente.


3) Parcelable no se puede utilizar cuando los datos se van a almacenar en el disco, porque Parcelable no puede garantizar la continuidad de los datos cuando cambia el mundo exterior. Aunque Serializable es ineficaz, se recomienda utilizar Serializable en este momento.


Los escenarios de aplicación


deben pasar a través de algunos de los datos entre una pluralidad de miembros Intención (Actividad o Servicio), el tipo simple (como: número, cadena) se puede colocar directamente en Intent. Los tipos complejos deben implementar la interfaz Parcelable.


6, definición de interfaz parcelable


copie el código
interfaz pública a Parcelable 
{
    // interfaz de descripción de contenido, sustancialmente sin tubo
    public int describeContents ();
    // función de interfaz de escritura,
    vacío público empaquetado writeToParcel (Parcel dest, las banderas int);
    // interfaz de lectura , El propósito es construir una instancia de una clase que implemente Parcelable from Parcel. Debido a que la clase de implementación aún no se puede conocer aquí, debe usar el método de plantilla y el nombre de la clase heredada se pasa a través del parámetro de plantilla
    // Para realizar la entrada de parámetros de plantilla, aquí se define la interfaz incorporada Creator, que contiene dos funciones de interfaz que devuelven instancias de clase heredadas únicas y múltiples, respectivamente,
    interfaz pública Creator <T> 
    {
           public T createFromParcel (fuente del paquete);
           public T [ ] newArray (int size);
    }
}
Copia el código
7. Pasos para


implementar Parcelable 1) implementa Parcelable


2) reescribe el método writeToParcel para serializar tu objeto en un objeto Parcel, es decir: escribe los datos de la clase en el Parcela provisto externamente , la necesidad de pasar los datos empaquetados al contenedor de almacenamiento Parcela, Parcela para obtener datos del contenedor


3) reescritura del método describeContents, descripción de la interfaz de contenido, se puede devolver por defecto 0


4) ejemplo de objetos estáticos internos implementar una interfaz CREATOR Parcelable.Creator


public static Final Parcelable.Creator <T> CREATOR
Nota: No se puede omitir una de las finales estáticas públicas y el nombre del objeto interno CREATOR no se puede cambiar y debe estar en mayúsculas. Es necesario reescribir dos métodos en esta interfaz: createFromParcel (Parcel in) para leer y pasar valores de datos desde el contenedor Parcel, encapsularlo en un objeto Parcelable y volver a la capa lógica, newArray (int size) para crear un tipo de T y una longitud de tamaño Array, solo una oración (devuelve nuevo T [tamaño]), usado por la clase externa para deserializar este tipo de arreglo.


En resumen: asigne su objeto al objeto Parcel a través de writeToParcel, y luego asigne el objeto Parcel a su objeto a través de createFromParcel. También puede pensar en Parcel como una secuencia, escribir objetos en la secuencia a través de writeToParcel y leer objetos de la secuencia a través de createFromParcel, pero necesita implementar este proceso, por lo que el orden de escritura y el orden de lectura deben ser consistentes.


El código es el siguiente:


copia el código
public class MyParcelable implementa Parcelable 
{
     private int mData;


     public int describeContents () 
     {
         return 0;
     }


     public void writeToParcel (Parcel out, int flags) 
     {
         out.writeInt (mData);
     }


     public static final Parcelable.Creator <MyParcelable> CREATOR = new Parcelable.Creator <MyParcelable> () 
     {
         public MyParcelable createFromParcel (Parcel in) 
         {
             return new MyParcelable (in);
         }


         public MyParcelable [] newArray (int size) 
         {
             return new MyParcelable [tamaño];
         }
     };
     
     privado MyParcelable (Parcela en) 
     {
         mData = in.readInt ();
     }
 }
复制 代码
8 、 Serializable 实现 与 Parcelabel 实现 的 区别


1) Para lograr Serializable, solo necesita implementar Serializable. Esto solo marca el objeto y el sistema lo serializará automáticamente.


2) La implementación de Parcelabel no solo necesita implementar Parcelabel, sino que también necesita agregar una variable miembro estática CREATOR a la clase, que necesita implementar la interfaz Parcelable.Creator.


Comparación de ambos códigos:


1) Crear una clase Person implementa Serializable


copiar el código
public class Person que implementa Serializable
{
    Private Long serialVersionUID = Final static -7060210544600464481L;
    Private String name;
    Private int Age;
    
    public String getName ()
    {
        return name;
    }
    
    public void setName (String name)
    {
        this.name = name;
    }
    
    public int getAge ()
    {
        return age;
    }
    
    public void setAge (int age)
    {
        this.age = age;
    }
}
Copiar código
2) Crear clase de libro e implementar Código de


copia de Parcelable
public class Implementos de libro Parcelable
{
    Private String bookName;
    private String author;
    private int publishDate ;
    
    public Book ()
    {
        
    }
    
    public String getBookName ()
    {
        return bookName;
    }
    
    public void setBookName (String bookName)
    {
        this.bookName = bookName;
    }
    
    public String getAuthor ()
    {
        autor de retorno;
    }
    
    public void setAuthor (String autor)
    {
        this.author = autor;
    }
    
    public int getPublishDate ()
    {
        return publishDate;
    }
    
    public void setPublishDate (int publishDate)
    {
        this.publishDate = publishDate;
    }
    
    @Override
    public int describeContents ()
    {
        return 0;
    }
    
    @Anular
    public void writeToParcel (Parcel out, int flags)
    {
        out.writeString (bookName);
        out.writeString (autor);
        out.writeInt (publishDate);
    }
    
    public static final Parcelable.Creator <Book> CREATOR = new Creator <Book> ()
    {
        @ Override
        public Book [] newArray (int size)
        {
            return new Book [size];
        }
        
        @Override
        public Book createFromParcel (Parcel in)
        {
            return new Book (in);
        }
    };
    
    Libro público (Parcela en)
    {
        bookName = in.readString ();
        autor = in.readString ();
        publishDate = in.readInt ();
    }
}
复制 代码

Supongo que te gusta

Origin blog.csdn.net/kerwinJu/article/details/52997445
Recomendado
Clasificación