关闭应用程序后,哈希图中的数据不保存

Posted

技术标签:

【中文标题】关闭应用程序后,哈希图中的数据不保存【英文标题】:Data in hashmap does not save after closing app 【发布时间】:2021-09-14 01:36:24 【问题描述】:

我目前正在 android studio 中创建一个应用程序,在其中我将用户输入存储到哈希映射中并将其显示到列表视图中,但是当我关闭应用程序并重新打开它时,数据消失了,它显示一个空的列表视图.

有没有办法解决这个问题?

【问题讨论】:

将该哈希映射保存在 sharedpreference 中。当您再次打开应用程序时,从该共享首选项中获取并在您的列表视图中设置 哈希图并不意味着在应用程序会话之间保持不变。在android中使用共享偏好来保存它们developer.android.com/reference/android/content/… HashMap 是一种内存数据结构。一旦对它的最后一次引用消失,它就不会驻留在内存中。如果您想保留它,请以某种方式将其写入磁盘。根据您使用数据的类型和方式,这可能意味着文件、共享首选项或数据库。 您必须将其存储到本地存储中,例如 ROOM 数据库、Realm、SharedPreference 【参考方案1】:

假设你有一个 hashMap val mp = HashMap<Int, String>()。然后,您需要在应用关闭时保存此哈希图的内容,并在应用打开时恢复数据。您可以将地图存储在sharedPreferencepreferenceDataStore 中。我将向您展示 sharedPreference 方式:

private val mp: HashMap<Int, String> = HashMap()
    private val preferenceName = "HASHMAP_PREFS"
    private val HASHMAP_KEY = "HASHMAP_KEY"
    private lateinit var sharedPreferences: SharedPreferences

    private fun initPref() 
        if(!this::sharedPreferences.isInitialized) 
            this.sharedPreferences = getSharedPreferences(preferenceName, Context.MODE_PRIVATE)
        
    

    private fun saveHashMap() 
        initPref()
        val editor = this.sharedPreferences.edit()
        val hashMapValue = Gson().toJson(mp)
        editor.putString(HASHMAP_KEY, hashMapValue)
        editor.apply()
    

    private fun restoreHashMap() 
        initPref()
        val hashMapAsStringValue = this.sharedPreferences.getString(HASHMAP_KEY, null)
        if(hashMapAsStringValue!=null) 
            val hashMapType: Type = object : TypeToken<HashMap<Int, String>>() .type
            val tempHashMap: HashMap<Int, String> = Gson().fromJson(hashMapAsStringValue, hashMapType)
            this.mp.putAll(tempHashMap) // the hashMap is restored
        
        Log.e("TAG", "hashMap = $mp.toString()")
    

这里,函数名称是自我解释的。只需在应用关闭时保存数据:

    override fun onDestroy() 
        saveHashMap()
        super.onDestroy()
    

并在应用打开时恢复数据:

override fun onCreate(savedInstanceState: Bundle?) 
        super.onCreate(savedInstanceState)
        setContentView(R.layout.main_activity)
     
        restoreHashMap()
        val key = System.currentTimeMillis().toInt() % 100
        val value = "$key*2"
        mp.put(key, value)
        // todo: logic, other codes...
    

注意,在这个例子中,我使用了 HashMap。如果您使用其他类型的地图,您应该相应地更改代码。

编辑

这是java代码的样子:

import android.content.Context;
import android.content.SharedPreferences;
import android.os.Bundle;

import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;

import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;

import java.lang.reflect.Type;
import java.util.HashMap;

public class DemoActivity extends AppCompatActivity 

    private HashMap<Integer, String> mp = new HashMap<>();
    private String preferenceName = "HASHMAP_PREFS";
    private String HASHMAP_KEY = "HASHMAP_KEY";

    private SharedPreferences sharedPreferences = null;

    private void initPreference() 
        if(sharedPreferences == null) 
            sharedPreferences = getSharedPreferences(preferenceName, Context.MODE_PRIVATE);
        
    

    private void saveHashMap() 
        initPreference();
        SharedPreferences.Editor editor = sharedPreferences.edit();
        Gson gson = new Gson();
        String hashMapValue = gson.toJson(mp);
        editor.putString(HASHMAP_KEY, hashMapValue);
        editor.apply();
    

    private void restoreHashMap() 
        initPreference();

        String hashMapValue = sharedPreferences.getString(HASHMAP_KEY, null);
        if(hashMapValue!=null) 
            Type hashMapType = new TypeToken<HashMap<Integer, String>>().getType();
            Gson gson = new Gson();
            HashMap<Integer, String> restoredHashMap = gson.fromJson(hashMapValue, hashMapType);
            mp.putAll(restoredHashMap);
        
    

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main_activity);
        restoreHashMap();
    

    @Override
    protected void onDestroy() 
        saveHashMap();
        super.onDestroy();
    

【讨论】:

我怎么写这是java?我会用“val”和“fun”代替什么? 我已经用一个 java 示例更新了我的答案。请检查一下。 感谢 sm 提供的代码。但是,我的应用程序没有按我的意愿运行:(

以上是关于关闭应用程序后,哈希图中的数据不保存的主要内容,如果未能解决你的问题,请参考以下文章

发送消息后,套接字神秘地从哈希图中删除

关闭程序后如何保存数据?

UserDefaults 不会在应用程序关闭并重新打开后保存数据

使用 MagicalRecord 截断所有应用程序关闭后不保存

ListView 位置关闭后不保存

将数据保存在 datagridview 中,以便在关闭程序后仍然存在