关闭应用程序后,哈希图中的数据不保存
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>()
。然后,您需要在应用关闭时保存此哈希图的内容,并在应用打开时恢复数据。您可以将地图存储在sharedPreference
或preferenceDataStore
中。我将向您展示 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 不会在应用程序关闭并重新打开后保存数据