zoukankan      html  css  js  c++  java
  • Android中Parcelable的使用

    转载请标明出处 :https://www.cnblogs.com/tangZH/p/10998065.html 

    更多精彩文章:http://77blogs.com/?p=286

    Parcelable与Serializable

    Serializable是Java为我们提供的一个标准化的序列化接口。

    Parcelable是Android为我们提供的序列化的接口。


    对比:

    1、Parcelable相对于Serializable的使用相对复杂一些。

    2、Parcelable的效率相对Serializable也高很多。

    3、Parcelable不能使用在要将数据存储在磁盘上的情况,因为Parcelable在外界有变化的情况下不能很好的保证数据的持续性。尽管Serializable效率低点,但此时还是建议使用Serializable。存储到设备或者网络传输上选择Serializable。


    序列化与反序列化

    序列化:将对象转换为可以传输的二进制流(二进制序列)的过程,这样我们就可以通过序列化,转化为可以在网络传输或者保存到本地的流(序列),从而进行传输数据 。

    反序列化:从二进制流(序列)转化为对象的过程。

    简单使用:

    进行Android开发的时候,无法将对象的引用传给Activities或者Fragments,我们需要将这些对象放到一个Intent或者Bundle里面,然后再传递。简单看一下:

    1、定义Book类,实现Parcelable接口。

    package com.status.mattest;
    
    import android.os.Parcel;
    import android.os.Parcelable;
    
    public class Book implements Parcelable {
    
        private String name;
        private int id;
        private String classify;
    
        protected Book(Parcel in) {
            name = in.readString();
            classify = in.readString();
            id = in.readInt();
        }
    
        public Book(String classify, String name, int id) {
            this.name = name;
            this.id = id;
            this.classify = classify;
        }
    
        /**
         * 反序列化
         */
        public static final Creator<Book> CREATOR = new Creator<Book>() {
            @Override
            public Book createFromParcel(Parcel in) {
                return new Book(in);
            }
    
            @Override
            public Book[] newArray(int size) {
                return new Book[size];
            }
        };
    
        @Override
        public int describeContents() {
            return 0;
        }
    
        /**
         * 序列化过程
         *
         * @param dest
         * @param flags
         */
        @Override
        public void writeToParcel(Parcel dest, int flags) {
            dest.writeString(name);
            dest.writeString(classify);
            dest.writeInt(id);
        }
    
    
        @Override
        public String toString() {
            return "name : " +
                    name + """ + "id : " + id + """ + "classify" + classify;
        }
    }

    writeToParcel:序列化过程

    Creator与protected Book(Parcel in)配合实现反序列化,转换为对象。

    注意:类中有多个String或者其它相同对象的话,那么writeToParcel中writeString的顺序是怎么样的,protected Book(Parcel in) {}中readString的顺序就得是怎么样的。

    2、mainActivity中:

    textView.setOnClickListener(new View.OnClickListener() {
          @Override
          public void onClick(View v) {
              Intent intent = new Intent(MainActivity.this, Test1Activity.class);
              intent.putExtra("key", new Book("哈", "鸿", 8));
              startActivity(intent);
          }
      });

    3、另一个Activity获取:

     Intent intent = getIntent();
     Book book = intent.getParcelableExtra("key");
     Log.d("Test1Activity", book.toString());

    输出:


    Book类里面有其它对象:

    如果Book类里面有其他对象(比如实体类Data)的话,那么Data也需要实现Parcelable接口,用法与上面的Book类一样。

    writeToParcel里面需要写上:dest.writeParcelable(data, 0);

    protected Book(Parcel in) {}里面需要写上data = in.readParcelable(Data.class.getClassLoader());


     参考:https://www.jianshu.com/p/df35baa91541

  • 相关阅读:
    Python Revisited Day 13 (正则表达式)
    Python Revisited Day 06 (面向对象程序设计)
    Python Revisited (变量)
    Python Revisited Day 05(模块)
    Python Revisited Day 04 (控制结构与函数)
    Python Revisited Day 03 (组合数据类型)
    Numpy
    Python Revisited Day 01
    Python3使用openpyxl读写Excel文件
    Python3操作YAML文件
  • 原文地址:https://www.cnblogs.com/tangZH/p/10998065.html
Copyright © 2011-2022 走看看