java - SharedPreferences 在应用程序退出时不保存

标签 java android sharedpreferences

我的应用程序不保存共享首选项。我尝试使用 commit()apply() 来保存这些首选项,但应用程序关闭后它们不会保存。如果我更改应用程序中的屏幕,则会进行更改,但在应用程序重新启动时会丢失。

应用程序启动时调用的静态方法:

static {
        prefs = PreferenceManager.getDefaultSharedPreferences(MainActivity.getContext());//MainActivity.getContext().getSharedPreferences("LocationTimer", Context.MODE_PRIVATE);
        editor = prefs.edit();
        if(!prefs.contains("totalLocations")) {
            prefs.edit().putInt("totalLocations", 0).commit();
        }
        if(prefs.getInt("totalLocations", 0) == 0) {
            for (int i = 1; i <= COUNT; i++) {
                addItem(createLocationItem(i));
            }
            Log.i("PREFERENCES", "CREATED 1 LOCATION");
        } else {
            for (int i = 1; i <= prefs.getInt("totalLocations", 1); i++) {
                addItem(new LocationItem(String.valueOf(i), "Location " + String.valueOf(i), prefs.getString(String.valueOf(i), "")));
            }
            Log.i("PREFERENCES", "LOADED LOCATION(S)");
        }
        Log.i("PREFERENCES", "LOADED " + String.valueOf(prefs.getInt("totalLocations", 1)) +" LOCATION(S)");
    }

记录的消息是“PREFERENCES: LOADED LOCATION(S)”而不是“PREFERENCES: CREATED 1 LOCATION”,所以我知道该项目正在加载而不是简单地创建。

创建/加载任何项目时调用的方法:

public static void addItem(LocationItem item) {
        ITEMS.add(item);
        ITEM_MAP.put(item.id, item);

        saveStringToPreferences(item.id, item.details);

        editor.putInt("totalLocations", ITEMS.size());
        editor.apply();

        Log.i("PREFERENCES", "CONTAINS " + String.valueOf(prefs.getInt("totalLocations", 1)) +" LOCATION(S)");
        Log.i("ITEMS", "CONTAINS " + String.valueOf(ITEMS.size()) +" LOCATION(S)");
    }

我如何知道这是在应用程序已加载时保存首选项,上面的消息显示除一个之外的其他数字。一是应用加载时显示的金额。

感谢您的帮助和建议。如果您有任何疑问,请留言,我会尽快回复。

最佳答案

对于遇到此类问题的每个人,我的解决方法是将 SharedPreferences 放入专用的类文件中。我创建了一个名为 AssetLoader.java 的文件,并将所有 SharedPreferences 编辑和初始化都放在其中。

这是我的 AssetLoader 文件:

import android.content.Context;
import android.content.SharedPreferences;

import com.xenicdev.locationtimer.MainActivity;

public class AssetLoader {
    private static SharedPreferences prefs;

    public static void load() {

        // Prefs
        prefs = MainActivity.getContext().getSharedPreferences("LocationTimer", Context.MODE_PRIVATE);
        if(!prefs.contains("totalLocations")) {
            prefs.edit().putInt("totalLocations", 0).apply();
        }
    }

    public static void setTotalLocations(int totalLocations) {
        prefs.edit().putInt("totalLocations", totalLocations).apply();
    }

    public static Integer getTotalLocations() {
        return prefs.getInt("totalLocations", 0);
    }

    public static void setItemDetails(String id, String details) {
        prefs.edit().putString(id, details).apply();
    }

    public static String getItemDetails(String id) {
        return prefs.getString(id, "");
    }
}

在创建主文件时添加:

AssetLoader.load();

要在其他文件中调用这些方法,请添加:

AssetLoader.getTotalLocations();

使用此方法的另一个好处是,如果您删除所有 SharedPreferences 并仅使用对 AssetLoader 的调用,则可以清理相当多的其他类。

关于java - SharedPreferences 在应用程序退出时不保存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37369438/

相关文章:

java - 在java中通过套接字发送对象的意外行为

java - 创建 SessionFactory 时出现错误

android - 用于创建此效果的最佳布局组合是什么?

android - SharedPreferences 仅返回默认值

java - Jersey MOXy 不解析 Snake_case

java - 断开连接/错误时清除 socket.io 缓冲区

android - 如何在向下滚动后自动隐藏状态栏?

java - 在构建文件崩溃应用程序中使用 Multidex 启用 True 并出现空指针异常

android - 未设置文件名时读取 SharedPreferences

java - SharedPreferences 值继续返回为零 - 无法检索 'Data' 字符串的值