zoukankan      html  css  js  c++  java
  • 【Android】Android中Parcelable接口的定义和使用

    学友资料: 

    Android Activity之间数据传递 Parcelable和Serializable接口的使用

    Android中Parcelable接口用法

    Parcelable接口的使用

    Android parcelable 详解

    自定义对象排序(数组/ArrayList)

    【Android数据传递】Intent传递List和Object和List<Object>(附源码)

    什么是Parcelable ?

         Parcelable,定义了将数据写入Parcel,和从Parcel中读出的接口。一个实体(用类来表示),如果需要封装到消息中去,就必须实现这一接口,实现了这一接口,该实体就成为“可打包的”了。就是传递的实体是对象。

    Parcelable 传递对象

        Android序列化对象主要有两种方法:

        1.实现Serializable接口,实现Serializable接口是JavaSE本身就支持的;

        2.实现Parcelable接口,Parcelable是Android特有的功能,效率比实现Serializable接口高,像用于Intent数据传递也都支持,而且还可以用在进程间通信(IPC),

          除了基本类型外,只有实现了Parcelable接口的类才能被放入Parcel中。

    Parcelable接口定义

    public interface Parcelable {
        //内容描述接口,基本不用管
        public int describeContents();
        //写入接口函数,打包
        public void writeToParcel(Parcel dest, int flags);
         //读取接口,目的是要从Parcel中构造一个实现了Parcelable的类的实例处理。因为实现类在这里还是不可知的,所以需要用到模板的方式,继承类名通过模板参数传入。
        //为了能够实现模板参数的传入,这里定义Creator嵌入接口,内含两个接口函数分别返回单个和多个继承类实例。
        public interface Creator<T> {
               public T createFromParcel(Parcel source);
               public T[] newArray(int size);
           }

    怎么实现Parcelable接口?

       从parcelable接口定义中,我们可以看到,实现parcelable接口,需要我们实现下面几个方法:

       1.describeContents方法。内容接口描述,默认返回0就可以;

       2.writeToParcel 方法。该方法将类的数据写入外部提供的Parcel中.即打包需要传递的数据到Parcel容器保存,以便从parcel容器获取数据,该方法声明如下:

         writeToParcel (Parcel dest, int flags) 具体参数含义见javadoc

       3.静态的Parcelable.Creator接口,本接口有两个方法:

         createFromParcel(Parcel in)  从Parcel容器中读取传递数据值,封装成Parcelable对象返回逻辑层。

         newArray(int size) 创建一个类型为T,长度为size的数组,仅一句话(return new T[size])即可。方法是供外部类反序列化本类数组使用。

     ====================================================

    代码实现

        1.封装数据,把实现parcelable接口的Person对象传递到TwoActivity里;

    public class DemoActivity extends Activity {
        /** Called when the activity is first created. */
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
            // 封装数据
            Person p = new Person();
            p.setId(1);
            p.setName("xiaoming");
            // 用Intent传递Person对象
            Intent i = new Intent(this, TwoActivity.class);
            i.putExtra("Person", p);
            startActivity(i);
        }
    }

       2.TwoActivity获取数据,从DemoActivity传递的Person对象给解析,并打印;

       

    public class TwoActivity extends Activity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            // TODO Auto-generated method stub
            super.onCreate(savedInstanceState);
            
            Person p = (Person)getIntent().getParcelableExtra("Person");
            
            System.out.println("p_id"+p.getId());
            System.out.println("p_name"+p.getName());
        }
    }

    3.parcelable接口的实现

     1 public class Person implements Parcelable{
     2     
     3     // 成员变量
     4     private int id;
     5     private String name;
     6     
     7     // 1.必须实现Parcelable.Creator接口,否则在获取Person数据的时候,会报错,如下:
     8     // android.os.BadParcelableException:
     9     // Parcelable protocol requires a Parcelable.Creator object called  CREATOR on class com.um.demo.Person
    10     // 2.这个接口实现了从Percel容器读取Person数据,并返回Person对象给逻辑层使用
    11     // 3.实现Parcelable.Creator接口对象名必须为CREATOR,不如同样会报错上面所提到的错;
    12     // 4.在读取Parcel容器里的数据事,必须按成员变量声明的顺序读取数据,不然会出现获取数据出错
    13     // 5.反序列化对象
    14     public static final Parcelable.Creator<Person> CREATOR = new Creator(){
    15 
    16         @Override
    17         public Person createFromParcel(Parcel source) {
    18             // TODO Auto-generated method stub
    19             // 必须按成员变量声明的顺序读取数据,不然会出现获取数据出错
    20             Person p = new Person();
    21             p.setId(source.readInt());
    22             p.setName(source.readString());
    23             return p;
    24         }
    25 
    26         @Override
    27         public Person[] newArray(int size) {
    28             // TODO Auto-generated method stub
    29             return new Person[size];
    30         }
    31     };
    32     
    33     public int getId() {
    34         return id;
    35     }
    36 
    37     public void setId(int id) {
    38         this.id = id;
    39     }
    40 
    41     public String getName() {
    42         return name;
    43     }
    44 
    45     public void setName(String name) {
    46         this.name = name;
    47     }
    48 
    49     @Override
    50     public int describeContents() {
    51         // TODO Auto-generated method stub
    52         return 0;
    53     }
    54 
    55     @Override
    56     public void writeToParcel(Parcel dest, int flags) {
    57         // TODO Auto-generated method stub
    58         // 1.必须按成员变量声明的顺序封装数据,不然会出现获取数据出错
    59         // 2.序列化对象
    60         dest.writeInt(id);
    61         dest.writeString(name);
    62     }
    63 }

    在用多线程的时候,会需要在Message中传递自己定义的Arraylist

    但是呢,Messge的数据传递必须要用Bundle

    所以需要将自定义的ArrayList<Object>放入Bundle

    解决方法是用Bundle.putParcelableArrayList(list)

    当然不能直接把list放入bundle中,必须经过加工

    方法如下:

    Message msg = new Message();

    Bundle bundle = new Bundle();

    ArrayList list = new ArrayList(); //这个list用于在budnle中传递 需要传递的ArrayList<Object>

    list.add(ArrayList<Object>)

    bundle.putParcelableArrayList("list",list)

    msg.setDate(bundle)
    Handler.sendMessage(msg)


    取的时候:
    ArrayList list = bundle.getParcelableArrayList("list");
    list2= (List<Object>) list.get(0);//强转成你自己定义的list,这样list2就是你传过来的那个list了。

    好了,parcelable接口的实现,到处结束!!

    转载请注明出处:http://www.cnblogs.com/hpboy

    =============================================

    demo下载:http://download.csdn.net/detail/xubuhang/8695159

                              作者:xubuhang                出处:http://www.cnblogs.com/xubuhang/ 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。 

     
查看全文
  • 相关阅读:
    PHP基础学习笔记(一)
    安装wampserver之后,浏览器中输入localhost页面显示IIS7解决办法
    HTML5常识总结(一)
    AngularJs中的服务
    AngularJs中的directives(指令part1)
    Happy Number——LeetCode
    Binary Tree Zigzag Level Order Traversal——LeetCode
    Construct Binary Tree from Preorder and Inorder Traversal——LeetCode
    Construct Binary Tree from Inorder and Postorder Traversal——LeetCode
    Convert Sorted Array to Binary Search Tree——LeetCode
  • 原文地址:https://www.cnblogs.com/xubuhang/p/4500181.html
  • Copyright © 2011-2022 走看看