在 savedInstanceState 中存储日期的最佳方式是什么?

What is the best way to store Date in savedInstanceState?

我正在使用 onSaveInstanceState 方法在片段内存储和检索局部变量。 我的一个片段中有以下代码(简化):

private final SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy - HH:mm");
private Date myDate;

public Date getDate() { return myDate; }

public void setDate(Date date) { this.myDate = date; }

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View rootView = inflater.inflate(R.layout.main, container, false);

    TextView tvDate = (TextView) rootView.findViewById(R.id.textview_date);

    if (savedInstanceState != null) {
        try {
            myDate = dateFormat.parse(savedInstance.State.getString("DATE"));
        catch (ParseException e) {
        }
    }

    //myDate is being set by a different fragment using the setDate method

    if (tvDate != null)
        tvDate.setText(dateFormat.format(myDate));

    return rootView;
}

@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
    super.onSaveInstanceState(savedInstanceState);
    savedInstanceState.putString("DATE", dateFormat.format(myDate));
}

这样我就可以在我的视图被销毁和重新创建时存储和检索日期值,例如通过旋转屏幕,这是主要问题。 这行得通,但我可以看出这效率不高。如果我像这样存储更多变量,视图创建将花费更长的时间(加载 10 个包含字符串和布尔值的变量需要几秒钟)。

我想知道是否有更好的方法来做到这一点。欢迎任何建议。

Android 也使用 onSavedInstanceState() 方法来保存它的状态,比如当 activity 被销毁时片段的状态,还有一些小部件保存它的状态,比如 EditText ,我们不需要保存 Edittext 的状态,Android 在 onSavedInstanceState() 的帮助下处理。

所以我只想告诉你这是保存状态的有效方法。

首先,就像其他人已经指出的那样,我认为十个变量不会引起问题。肯定还有其他原因导致了延迟。

其次,一种更简单有效的方法是使用 date.getTime() 长值而不是解析您的日期字符串并同样恢复它。

以重申为代价,您的滞后是由于其他原因造成的。您可以通过记录每个生命周期甚至完成所需的时间来验证这一点并找出罪魁祸首。

DateSerializable。停止将其与字符串相互转换。直接把它放在 Bundle 中,使用 putSerializable(), retrieving it via getSerializable().

如果这不能解决您潜在的性能问题,请使用开发工具,例如您 IDE 中的方法跟踪,以确定您将时间花在哪里。

您的代码似乎不会导致性能问题,并且是在 Android 上存储状态的正常且有效的方式。我在下面的代码中添加了一些 comments/adjustments,但这可能会解决其他错误或加快速度。

    private static final String STATE_DATE = "state:date";

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, e Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout.main, container, false);

        TextView tvDate = (TextView) rootView.findViewById(R.id.textview_date);

        // Check if the savedInstanceSTate contains the date String key.
        if (savedInstanceState != null
                && savedInstanceState.containsKey(STATE_DATE)) {

            try {
                // Consider doing complex tasks like parsing etc. in the background.
                // Parsing a date shouldn't be the issue here but doing many things like this may 
                // be the cause of the performance issue. 
                myDate = dateFormat.parse(savedInstanceState.getString(STATE_DATE));
                catch(ParseException e){
                }
            }

            //myDate is being set by a different fragment using the setDate method

            if (tvDate != null)
                tvDate.setText(dateFormat.format(myDate));

            return rootView;

        }
    }

    @Override
    public void onSaveInstanceState(Bundle savedInstanceState) {
        super.onSaveInstanceState(savedInstanceState);
        // Remove the date formatter here. Try to format your date immediately when storing it in the variable.
        // When restoring your date from your savedInstanceState you're already formatting it.
        savedInstanceState.putString(STATE_DATE, myDate);
    }