如何为getSharedPreferences添加监视(它存储在哪里?)

时间:2018-03-04 17:46:55

标签: android android-studio

我已经测试了几个样本天气应用程序代码项目,寻找一个可以在android studio中轻松编译的3到5天的预测。我无法找到一个符合我理解水平的简单方法,但可以使用一个可能有用的方法。 (如果有人知道一个简单的最新天气预报应用程序,请在下面注明)

有问题的第一行。

if (getSharedPreferences(KEY_PREF, 0).getBoolean(KEY_PREF, true)
            && servicesConnected())

自:

private static final String KEY_PREF = "firstrun";

if (getSharedPreferences(KEY_PREF, 0).getBoolean(KEY_PREF, true)
            && servicesConnected()) {
    if (getSharedPreferences(KEY_PREF, 0).getBoolean(KEY_PREF, true)
            && servicesConnected()) {
        // get current city lat lon
        buildGoogleApiClient();
        mClient.connect();
        CommonUtils.showToast("Retrieving your current location...");
        // this will be done one time only
        getSharedPreferences(KEY_PREF, 0).edit()
                .putBoolean(KEY_PREF, false).apply();
    } else if (savedInstanceState == null) {
        if (DBHelper.getInstance().getCityCount() == 0) {
            // called only if the cities array is empty too add a city
            getSupportFragmentManager()
                    .beginTransaction()
                    .add(R.id.container, new AddCityFragment(),
                            AddCityFragment.class.getSimpleName()).commit();
        } else {
            getSupportFragmentManager().beginTransaction()
                    .add(R.id.container, new WeatherFragment()).commit();
        }
    }

}

根据developer.android.com

  

boolean getBoolean(String key,boolean defValue)   参数:(1)字符串键:要检索的首选项的名称。 (2)defValue boolean:如果此首选项不存在则返回的值。

我原来的问题是:

  1. getBoolean到底在做什么?

  2. 文档中没有说明模式0 在getSharedPreferences(String name,int mode)的第二个参数中的含义。知道什么吗?

  3. 如何将getSharedPreferences手表添加到Android Studio的调试

  4. 我在你们的帮助下推断出的解决方案:

    1. getSharedPreferences(KEY_PREF,0)正在Android设备上查找KEY_PREF首选项文件。它返回一个对象,它允许我们使用getBoolean来确定其中是否有一个具有相同名称的键。在这种情况下,它正在寻找一个" firstrun"在实际的Android设备存储(保存为缓存)上首次运行应用程序时不存在的文件。由于密钥在第一次运行时不存在,因此将布尔值设置为true并继续在if语句内运行。如果关键" firstrun"存在,它被设置为false然后它将返回false并跳过在if语句的那一部分内执行。

    2. 模式0是MODE_PRIVATE =默认模式,其中创建的文件只能由调用应用程序(或共享相同用户ID的所有应用程序)访问。

    3. 当我尝试调试该问题时,我注意到我可以为getSharedPreferences(KEY_PREF,0)添加一个调试器监视,并在调试器中查找生成的首选项文件,以查看sharedPreferences的mMap参数对象创造了一个" firstrun"键值为" false"。这是我第一次看到它如何增加这个价值。

    4. 我还发现了一个很酷的插件,适用于android和Mac的Windows工作室,这比进入Android设备或虚拟设备并清除应用缓存更快。它被称为ADB idea,并与CTRL + ALT + SHIFT +一个热键组合一起使用。

      谢谢大家!

2 个答案:

答案 0 :(得分:2)

SharedPreference只是存储一些小尺寸数据的一种方式。

  

1)如果它不存在,为什么它会返回true?

如果需要,可以让它返回false。这只是该密钥的默认值。您应该根据数据逻辑将default设置为true / false。对于他们的特定情况,为该键设置默认值true与他们的app逻辑一致。

例如,AFAIK android sdk并没有向我们提供任何可以说应用程序第一次运行的api。因此,要知道如果应用程序第一次运行,您可以获得类似" is_first_run"等键的布尔值。并将默认值设为true。如果应用程序是第一次运行,那么此值将不会存在于共享首选项中,因为您尚未设置它。所以,默认值true是有道理的。如果您发现它是真的,那么将其设置为false,以便下次运行应用程序时,它将返回false。如果清除缓存,则该值将再次为真,因为缓存已被销毁且变量不再存在。

  

2)质疑SharedPreferences的操作模式0是什么getSharedPreferences(String name,int mode)

操作模式0只是PRIVATE_MODE。开发人员应该使用变量而不是仅将其设置为零。它们是共享首选项的多种模式。您可以查看文档以获取更多信息。私有模式意味着此数据只能由此应用程序访问。

  

3)如何为getSharedPreferences添加监视(它存储在哪里?)

不确定adding a watch的含义。你在谈论sharedPreference上的事件监听器吗? AFAIK,你不能这样做。此外,共享首选项存储在应用程序的缓存目录中,该目录可以是/ data / app / appname / cache或其他东西(肯定是idk)

答案 1 :(得分:0)

共享首选项存储数据,直到您删除并重新安装应用

getBoolean(“this is the key”,true);

如果getBoolean返回null,则整个语句的计算结果为true

如果是getBoolean(“这是键”,则为false);

这意味着如果它返回null,则将其评估为false

Meaning why would it return true if it doesn't exist?

这是你的问题吗?

编码器可以选择将其设为真或假,如

首先,当用户登录时甚至没有触摸sharedPreferences 然后它可能会返回第二个参数

喜欢

if(SharedPreferences.getBoolean('isUserOld' , true)){

Toast.make( Context , "Welcome to Our App" , Long).show()


}

这里检查用户是否老了 如果用户不老,则由于第二个参数返回true而执行了块

这表示新用户已登录