在onSaveInstanceState中保存什么?

时间:2014-07-25 20:43:30

标签: android android-fragments

我认为我在onSaveInstanceState机制中并没有真正理解的东西: 我有一个包含几个数据的类:

public class Site implements Serializable {

    private static final long serialVersionUID = 1L;
    // used to save device language when the application starts
    private String deviceLanguage;
    private int deviceWifiState;
    private int deviceWifiNetworkId;

    private String localeLanguage;

    // URLs to access various files to describe site and points of interests
    private String wifiSSID = null;
    private String wifiWPAKey = null;
    private String url = null;
    private String flagsDir = "flags/";
    private String flagsUrl = null;
    private String mediasDir = "medias/";
    private String mediasUrl = null;
    private String descriptionFileUrl = null;
    private FragmentActivity activity;

    private ArrayList<Language> listLanguages = null;
    private ArrayList<PointOfInterest> listPointsOfInterest = null;

    ...
    // and some getter/setter
}

所以MainActivity膨胀Fragment_init开始填充Site类。 主要是ArrayList。

Fragment_init不在后台堆栈中。 作业完成后,它会自动提交()一个新的Fragment_selectLanguage,用户在继续初始化之前设置其语言。 完成后,该线程将被置于后台堆栈中,第三个Fragment_play()将被提交。

所有片段都实现了以下onsaveInstanceState方法,并将Bundle带回了onViewCreated方法。

@Override
public void onSaveInstanceState(Bundle saveInstanceState) {
    super.onSaveInstanceState(saveInstanceState);

    saveInstanceState.putSerializable(FRAGMENT_SELECT_LANGUAGE_SITE, (Serializable) site);
}

在第三个片段中,如果我改变屏幕方向然后返回到前一个片段,当它使用listeLanguages时,我得到一个空指针异常,通常在第一个片段中初始化,这是null。

当我检查Site类时,我发现大多数数据都在里面,但有些数据通常是数组。

我想念什么?我以为整个Site类都已保存了!?

此致

2 个答案:

答案 0 :(得分:0)

因为您无法序列化自定义对象。

请参阅此问题以获取具体实施(第二个答案),store and retrieve a class object in shared preference

使用名为Gson的第三方导入https://github.com/pchauhan/StoreandRetrieveObjectClassDemo

答案 1 :(得分:0)

所以实际上我将Site从Serializable改为Parcelable,然后使用:

完美地工作
@Override
public void onSaveInstanceState(Bundle saveInstanceState) {
    super.onSaveInstanceState(saveInstanceState);
    Log.d("2ndGuide", "MainActivity: onSaveInstanceState");
    saveInstanceState.putParcelable(MAIN_ACTIVITY_SITE, site);
}

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    Log.d("2ndGuide", "MainActivity: onCreate");
    setContentView(R.layout.activity_main);

    if (savedInstanceState == null) {
        site = new Site();
    } else {
        site = (Site)savedInstanceState.getParcelable(MAIN_ACTIVITY_SITE);
    }
}