Android传递对象的三种方式


迷茫,是青春最真实的状态;但奋斗,才是青春的主基调;努力是打败焦虑的绝好方法!


Android传递对象的三种方式

参考博客:Android传递对象的三种方法

Serializable接口
  • 创建两个可序列化对象

    • Book.class
    package com.hnucm.androiddemo.Model;
    
    import java.io.Serializable;
    
    //可序列化对象
    public class Book implements Serializable {
        String name;
        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;
        }
    
        public Book(String name, Author author) {
            this.name = name;
            this.author = author;
        }
    
        @Override
        public String toString() {
            return "Book{" +
                    "name='" + name + '\'' +
                    ", author=" + author +
                    '}';
        }
    }
    
    • Author.class
    package com.hnucm.androiddemo.Model;
    
    import java.io.Serializable;
    //可序列化对象
    public class Author implements Serializable {
        String name;
        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;
        }
    
        public Author(String name, int age) {
            this.name = name;
            this.age = age;
        }
    
        @Override
        public String toString() {
            return "Author{" +
                    "name='" + name + '\'' +
                    ", age=" + age +
                    '}';
        }
    }
    
  • 进行序列化,利用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.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传递对象
                    intent.putExtra("book",book);
                    //执行,打开下一个界面
                    startActivity(intent);
                }
            });
        }
    }
    
  • 进行反序列化,利用key来获取对象。

    • 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;
    
    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) {
                    //接收另一个界面传过来的对象
                    //以标志String来确认接收对象
                    Book book = (Book) getIntent().getSerializableExtra("book");
                    textView.setText("书名:" + book.getName());
                    Log.d("作者",book.getAuthor().getName());
                }
            });
        }
    }
    
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;
    
    import org.parceler.Parcels;
    
    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) {
                    //接收另一个界面传过来的对象
                    //采用Parcels.unwrap恢复对象
                    Book book = Parcels.unwrap(getIntent().getParcelableExtra("book"));
                    textView.setText("书名:" + book.getName());
                    Log.d("作者",book.getAuthor().getName());
                }
            });
        }
    }
    
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值