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

问题描述 投票:0回答:2

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

有问题的第一行。

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)String key:要检索的首选项的名称。 (2)defValue boolean:如果此首选项不存在则返回的值。

我原来的问题是:

  1. getBoolean到底在做什么?
  2. 该文档没有说明getSharedPreferences(String name,int mode)的第二个参数中0模式的含义。知道什么?
  3. 如何将getSharedPreferences的监视添加到Android Studio的调试中

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

  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”。这是我第一次看到它如何增加这个价值。

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

感谢大家!

android android-studio
2个回答
1
投票

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

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

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

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

2)对于SharedPreferences getSharedPreferences(String name,int mode)的问题是什么是操作模式0

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

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

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


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

这表明新用户已登录

© www.soinside.com 2019 - 2024. All rights reserved.