我已经测试了几个样本天气应用程序代码项目,寻找一个可以在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();
}
}
}
boolean getBoolean(String key,boolean defValue) 参数:(1)字符串键:要检索的首选项的名称。 (2)defValue boolean:如果此首选项不存在则返回的值。
我原来的问题是:
getBoolean到底在做什么?
文档中没有说明模式0 在getSharedPreferences(String name,int mode)的第二个参数中的含义。知道什么吗?
如何将getSharedPreferences手表添加到Android Studio的调试
我在你们的帮助下推断出的解决方案:
getSharedPreferences(KEY_PREF,0)正在Android设备上查找KEY_PREF首选项文件。它返回一个对象,它允许我们使用getBoolean来确定其中是否有一个具有相同名称的键。在这种情况下,它正在寻找一个" firstrun"在实际的Android设备存储(保存为缓存)上首次运行应用程序时不存在的文件。由于密钥在第一次运行时不存在,因此将布尔值设置为true并继续在if语句内运行。如果关键" firstrun"存在,它被设置为false然后它将返回false并跳过在if语句的那一部分内执行。
模式0是MODE_PRIVATE =默认模式,其中创建的文件只能由调用应用程序(或共享相同用户ID的所有应用程序)访问。
当我尝试调试该问题时,我注意到我可以为getSharedPreferences(KEY_PREF,0)添加一个调试器监视,并在调试器中查找生成的首选项文件,以查看sharedPreferences的mMap参数对象创造了一个" firstrun"键值为" false"。这是我第一次看到它如何增加这个价值。
我还发现了一个很酷的插件,适用于android和Mac的Windows工作室,这比进入Android设备或虚拟设备并清除应用缓存更快。它被称为ADB idea,并与CTRL + ALT + SHIFT +一个热键组合一起使用。
谢谢大家!
答案 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而执行了块
这表示新用户已登录