Android:我应该传递serializable还是从Bundle重新创建对象?

时间:2015-03-02 03:37:53

标签: java android serialization bundle

所以我有一个Calendar obj,它默认实现serializable,我想把它传递给一个bundle,所以它的值保存在屏幕旋转上。

我应该将其作为可序列化传递还是提取值并重新创建obj以提高效率?

bundle.putSerializable("key", calendar);

bundle.putInt("dayKey", calendar.get(Calendar.DAY_OF_MONTH));
bundle.putInt("monthKey", calendar.get(Calendar.MONTH));
bundle.putInt("yearKey", calendar.get(Calendar.YEAR));

4 个答案:

答案 0 :(得分:2)

Serializable不建议使用Android;请改用Parcelable

我猜它取决于Object的大小以及手动重建的麻烦。

答案 1 :(得分:1)

Parcelable超过Serializable。如果效果很重要,Parcelable可能会快10倍(http://www.developerphil.com/parcelable-vs-serializable/

此外,您可以使用https://github.com/johncarl81/parceler来避免生成(并维护!)所有可能存在的样板代码。

@Parcel
public class Person {
  ...
}

Parcelable parcelable = Parcels.wrap(new Person(..));
Person = Parcels.unwrap(parcelable);

答案 2 :(得分:0)

老实说,虽然Parcelable绝对是首选的序列化方法,但我认为对于这种情况你只需将它作为Serializable额外添加。考虑到重新创建Activity所完成的工作量,我认为序列化Calendar实例的费用可以忽略不计。

如果不出意外,它会使您的代码更易于维护和简洁。

答案 3 :(得分:0)

  • onSaveInstanceState方法用于存储Activity的状态。当您旋转屏幕按主页按钮或从通知栏打开新的活动时,它会调用。
  • 在onPause()方法之后调用。
  • 您可以将自定义对象或任何原始数据类型(即“活动”状态)保存为

    @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);        
        outState.putSerializable(KEY_CALENDAR, cal);        
    }
    
  • onRestoreInstanceState()方法用于恢复活动的状态。

  • 在onStart()方法之后调用

  • 您可以将活动状态恢复为

    @Override
    protected void onRestoreInstanceState(Bundle savedInstanceState) {
        super.onRestoreInstanceState(savedInstanceState);       
        cal = (Calendar) savedInstanceState.getSerializable(KEY_CALENDAR);
    }
    

    您可以在此处使用serializable来保存活动的状态。

  • 您还可以使用onCreate()方法恢复已保存的状态,因为bundle在onCreate(),onRestoreInstanceState()方法中的传递方式相同

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main); 
    
        if(savedInstanceState != null) {
            cal = (Calendar) savedInstanceState.getSerializable(KEY_CALENDAR);
        } else {
            cal = Calendar.getInstance();
            cal.setTime(new Date());    
        }
    }