【问题标题】:Android HashMap not persisting when returning to activity返回活动时Android HashMap不持久
【发布时间】:2016-04-08 22:08:00
【问题描述】:

当我导航到另一个活动并返回时,我试图保留我的 HashMap 值。这是我现在拥有的代码。

HashMap 工作并且能够从视图中的 EditText 抓取和保存数据。

但是,一旦我离开活动并返回,HashMap 就会重新初始化为空 -> {}

我查看了文档,看来这是确保变量数据持久化的正确方法。但是它不起作用。

请告诉我可能是什么问题:

public class ScriptActivity extends MainActivity {

    HashMap timeAndMessages;
    EditText message;
    EditText time;



    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_script);

        if (savedInstanceState != null) {
            timeAndMessages = (HashMap) savedInstanceState.getSerializable("alerts");
        } else {
            timeAndMessages = new HashMap();
        }

        message = (EditText)findViewById(R.id.messageText);
        time = (EditText)findViewById(R.id.timeText);
    }

    @Override
    protected void onRestoreInstanceState(Bundle savedInstanceState) {
        super.onRestoreInstanceState(savedInstanceState);

        restore(savedInstanceState);
    }

    private void restore(Bundle savedInstanceState) {
        if (savedInstanceState != null) {
            timeAndMessages = (HashMap) savedInstanceState.getSerializable("alerts");

        }
    }

    public void createMessage (View view){

        String stringmessage = message.getText().toString();
        int inttime = Integer.parseInt(time.getText().toString());

        timeAndMessages.put(inttime, stringmessage);

        Toast.makeText(getApplicationContext(), "Will display : " + stringmessage + " At time : " + Integer.toString(inttime) , Toast.LENGTH_LONG).show();
    }

    @Override
    public void onSaveInstanceState(Bundle outState, PersistableBundle outPersistentState) {
        super.onSaveInstanceState(outState, outPersistentState);
        outState.putSerializable("alerts", timeAndMessages);
    }
}

【问题讨论】:

  • 首先,我们看不到您的restore() 方法。其次,您的 onSaveInstanceState() 方法将仅用于 API 级别 21+ 设备。如果您的 minSdkVersion 低于 21,您可能想要只使用 BundleonSaveInstanceState() 版本。第三,这些实例状态不是针对任意场景,而是针对特定场景(例如,配置更改)。请编辑您的问题并解释“导航进出活动”的含义。
  • 能否请您发布“timeAndMessages”声明和初始化代码?如果它是用户定义对象的集合,那么也请发布该 POJO。
  • @CommonsWare 我的 API 级别为 23。outPersistentState 的添加/删除似乎不会影响代码
  • @ShadabAnsari 我发布了活动的完整代码。如果您有并回答,请告诉我!
  • 导航到另一个活动而不完成它并返回它不会重新开始您以前的活动。所以你不会得到你保存的状态。

标签: java android hashmap persistence instance


【解决方案1】:

但是,一旦我离开活动并返回,HashMap 就会重新初始化为空 -> {}

如果“离开活动并返回”,您的意思是按下“返回”按钮,然后做一些事情来开始新的活动......那么您的行为是预期的。

用于保存实例状态的Bundle主要用于两种场景:

  • 配置更改(例如,用户旋转屏幕)
  • 进程终止,用户返回到您最近的任务(例如,通过概览屏幕)

按 BACK 来销毁活动都不是这些。因此,不会保存状态。

如果 HashMap 代表模型数据——无论用户如何使用你的应用程序,你都希望能够一次又一次地取回的那种数据——将它保存到数据库中,SharedPreferences,其他类型的文件,或“云”。

您可以在the Activity documentation 中阅读有关这些场景的更多信息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-04
    • 2017-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多