Android传递对象的三种方式

94 阅读5分钟
            }

        });

    }

}



```

Parcelable接口

  • 创建两个实现了Parcelable接口的对象

  • 实现describeContentswriteToParcel方法

  • 创建Parcelable.Creator接口的实例

    • Book.class

      
      package com.hnucm.androiddemo.Model;
      
      
      
      import android.os.Parcel;
      
      import android.os.Parcelable;
      
      
      
      //可序列化对象
      
      public class Book implements Parcelable {
      
          String name;
      
          Author author;
      
      
      
          public Book(String name, Author author) {
      
              this.name = name;
      
              this.author = author;
      
          }
      
      
      
          public String getName() {
      
              return name;
      
          }
      
      
      
          public void setName(String name) {
      
              this.name = name;
      
          }
      
      
      
          public Author getAuthor() {
      
              return author;
      
          }
      
      
      
          public void setAuthor(Author author) {
      
              this.author = author;
      
          }
      
      
      
          protected Book(Parcel in) {
      
              name = in.readString();
      
              author = in.readParcelable(Author.class.getClassLoader());
      
          }
      
      
      
          //实现方法
      
          @Override
      
          public int describeContents() {
      
              return 0;
      
          }
      
      
      
          //实现方法
      
          @Override
      
          public void writeToParcel(Parcel parcel, int i) {
      
              parcel.writeString(name);
      
              parcel.writeParcelable(author, i);
      
          }
      
      
      
          //创建Creator接口实例
      
          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];
      
              }
      
          };
      
      }
      
      
      
      
    • Author.class

      
      package com.hnucm.androiddemo.Model;
      
      
      
      import android.os.Parcel;
      
      import android.os.Parcelable;
      
      
      
      //可序列化对象
      
      public class Author implements Parcelable {
      
          String name;
      
          int age;
      
      
      
          public Author(String name, int age) {
      
              this.name = name;
      
              this.age = 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;
      
          }
      
      
      
          protected Author(Parcel in) {
      
              name = in.readString();
      
              age = in.readInt();
      
          }
      
      
      
          //实现方法
      
          @Override
      
          public void writeToParcel(Parcel dest, int flags) {
      
              dest.writeString(name);
      
              dest.writeInt(age);
      
          }
      
      
      
          //实现方法
      
          @Override
      
          public int describeContents() {
      
              return 0;
      
          }
      
      
      
          //创建Creator接口实例
      
          public static final Creator<Author> CREATOR = new Creator<Author>() {
      
              @Override
      
              public Author createFromParcel(Parcel in) {
      
                  return new Author(in);
      
              }
      
      
      
              @Override
      
              public Author[] newArray(int size) {
      
                  return new Author[size];
      
              }
      
          };
      
      }
      
      
      
      
  • 进行序列化,利用Intent进行传递

  • 进行反序列化,利用key获取对象

  • MainActivity代码不变,SecondActivity代码只要把获取对象的方法由getSerializableExtra改为getParcelableExtra即可。

Json字符串

  • 首先引入gson依赖,使其可以使用gson转换对象为json格式

compile 'com.google.code.gson:gson:2.6.2'



  • 创建对象,成员变量可以并推荐private

    • Book.class

    
    package com.hnucm.androiddemo.Model;
    
    
    
    //对象
    
    public class Book {
    
        private String name;
    
        private Author author;
    
    
    
        public Book(String name, Author author) {
    
            this.name = name;
    
            this.author = author;
    
        }
    
    
    
        public String getName() {
    
            return name;
    
        }
    
    
    
        public void setName(String name) {
    
            this.name = name;
    
        }
    
    
    
        public Author getAuthor() {
    
            return author;
    
        }
    
    
    
        public void setAuthor(Author author) {
    
            this.author = author;
    
        }
    
    
    
    }
    
    
    
    
    • Author.class

    
    package com.hnucm.androiddemo.Model;
    
    
    
    //对象
    
    public class Author {
    
        private String name;
    
        private int age;
    
    
    
        public Author(String name, int age) {
    
            this.name = name;
    
            this.age = 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;
    
        }
    
    
    
    }
    
    
    
    
  • 将对象转换为json格式,使用Intent传递(序列化)

    • MainActivity

    
    package com.hnucm.androiddemo.Controller;
    
    
    
    import androidx.appcompat.app.AppCompatActivity;
    
    import android.content.Intent;
    
    import android.os.Bundle;
    
    import android.view.View;
    
    import android.widget.Button;
    
    import com.google.gson.Gson;
    
    import com.hnucm.androiddemo.Model.Author;
    
    import com.hnucm.androiddemo.Model.Book;
    
    import com.hnucm.androiddemo.R;
    
    
    
    public class MainActivity extends AppCompatActivity {
    
    
    
        @Override
    
        protected void onCreate(Bundle savedInstanceState) {
    
            super.onCreate(savedInstanceState);
    
            setContentView(R.layout.activity_main);
    
    
    
            Button button = findViewById(R.id.button);
    
            button.setOnClickListener(new View.OnClickListener() {
    
                @Override
    
                public void onClick(View view) {
    
                    //创建传递的对象
    
                    Author author = new Author("刘伟",35);
    
                    Book book = new Book("Java设计模式",author);
    
                    //采用Intent传递数据
    
                    //从当前界面传递到另一个界面,确定传递方向
    
                    Intent intent = new Intent(MainActivity.this,SecondActivity.class);
    
                    //利用标志String传递对象,采用json格式传递
    
                    intent.putExtra("book",new Gson().toJson(book));
    
                    //执行,打开下一个界面
    
                    startActivity(intent);
    
                }
    
            });
    
        }
    
    }
    
    
    
    
  • 将对象从json格式转换回对象(反序列化)

    • SecondActivity

    
    package com.hnucm.androiddemo.Controller;
    
    
    
    import androidx.appcompat.app.AppCompatActivity;
    
    import android.os.Bundle;
    
    import android.util.Log;
    
    import android.view.View;
    
    import android.widget.Button;
    
    import android.widget.TextView;
    
    import com.google.gson.Gson;
    
    import com.hnucm.androiddemo.Model.Book;
    
    import com.hnucm.androiddemo.R;
    
    
    
    public class SecondActivity extends AppCompatActivity {
    
    
    
        @Override
    
        protected void onCreate(Bundle savedInstanceState) {
    
            super.onCreate(savedInstanceState);
    
            setContentView(R.layout.activity_second);
    
    
    
            //初始化显示控件
    
            TextView textView = findViewById(R.id.textView);
    
    
    
            Button button = findViewById(R.id.button2);
    
            button.setOnClickListener(new View.OnClickListener() {
    
                @Override
    
                public void onClick(View view) {
    
                    //接收另一个界面传过来的对象
    
                    //根据key值保存传递过来的json字符串
    
                    String bookJson = getIntent().getStringExtra("book");
    
                    //将json字符串按照对象格式转换回对象
    
                    Book book = new Gson().fromJson(bookJson,Book.class);
    
                    textView.setText("书名:" + book.getName());
    
                    Log.d("作者",book.getAuthor().getName());
    
                }
    
            });
    
        }
    
    }
    
    
    
    

三种方式的性能对比

  • 转换为字符串的方式是最慢的。
  • Serializable次之,Parcelable比Serializable快十倍,所以按照性能都是用Parcelable。
  • 但是Parcelable中有大量重复代码,那么就要简化Parcelable的使用。

简化Parcelable

  • 引入第三方库进行简化操作

  • 常见的有Parcelerauto-parcelParcelableCodeGeneratorParcelableGenerator等等。

Parceler

注意事项:

  • 对象类一定要有构造函数。
  • 类的成员变量权限不为private。
  • 添加依赖

implementation 'org.parceler:parceler-api:1.1.12'

annotationProcessor 'org.parceler:parceler:1.1.12'



  • 添加注解,表示对象实现Parcelable接口,简化操作

    • Book.class

package com.hnucm.androiddemo.Model;



import org.parceler.Parcel;



//注解

@Parcel

//对象

public class Book {

    //成员变量权限不能为private

    String name;

    Author author;

    //一定要有构造方法

    public Book(){



    }



    public Book(String name, Author author) {

        this.name = name;

        this.author = author;

    }



    public String getName() {

        return name;

    }



    public void setName(String name) {

        this.name = name;

    }



    public Author getAuthor() {

        return author;

    }



    public void setAuthor(Author author) {

        this.author = author;

    }



}



  • Author.class

package com.hnucm.androiddemo.Model;



import org.parceler.Parcel;



//注解

@Parcel

//对象

public class Author {

    //成员变量权限不为private

    String name;

    int age;

    //一定要有构造方法

    public Author(){



    }



    public Author(String name, int age) {

        this.name = name;

        this.age = 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;

    }



}



  • 使用Parcels.wrap包装对象进行传递

    • MainActivity

    
    package com.hnucm.androiddemo.Controller;
    
    
    
    import androidx.appcompat.app.AppCompatActivity;
    
    import android.content.Intent;
    
    import android.os.Bundle;
    
    import android.os.Parcel;
    
    import android.view.View;
    
    import android.widget.Button;
    
    import com.hnucm.androiddemo.Model.Author;
    
    import com.hnucm.androiddemo.Model.Book;
    
    import com.hnucm.androiddemo.R;
    
    
    
    import org.parceler.Parcels;
    
    
    
    public class MainActivity extends AppCompatActivity {
    
    
    
        @Override
    
        protected void onCreate(Bundle savedInstanceState) {
    
            super.onCreate(savedInstanceState);
    
            setContentView(R.layout.activity_main);
    
    
    
            Button button = findViewById(R.id.button);
    
            button.setOnClickListener(new View.OnClickListener() {
    
                @Override
    
                public void onClick(View view) {
    
                    //创建传递的对象
    
                    Author author = new Author("刘伟",35);
    
                    Book book = new Book("Java设计模式",author);
    
                    //采用Intent传递数据
    
                    //从当前界面传递到另一个界面,确定传递方向
    
                    Intent intent = new Intent(MainActivity.this,SecondActivity.class);
    
                    //使用Parcels.wrap包装一个Parcelable对象,进行传递
    
                    intent.putExtra("book", Parcels.wrap(book));
    
                    //执行,打开下一个界面
    
                    startActivity(intent);
    
                }
    
            });
    
        }
    
    }
    
    
    
    
  • 使用Parcels.unwrap恢复对象

    • SecondActivity

    
    package com.hnucm.androiddemo.Controller;
    
    
    
    import androidx.appcompat.app.AppCompatActivity;
    
    import android.os.Bundle;
    
    import android.util.Log;
    
    import android.view.View;
    
    import android.widget.Button;
    
    import android.widget.TextView;
    
    import com.hnucm.androiddemo.Model.Book;
    
    import com.hnucm.androiddemo.R;
    

总结

其实要轻松掌握很简单,要点就两个:

  1. 找到一套好的视频资料,紧跟大牛梳理好的知识框架进行学习。
  2. 多练。 (视频优势是互动感强,容易集中注意力)

你不需要是天才,也不需要具备强悍的天赋,只要做到这两点,短期内成功的概率是非常高的。

对于很多初中级Android工程师而言,想要提升技能,往往是自己摸索成长,不成体系的学习效果低效漫长且无助。下面资料部分截图是我花费几个月时间整理的,诚意满满:特别适合有3-5年开发经验的Android程序员们学习。