无法强制转换为java.lang.Long Android SharedPreferences

时间:2017-12-07 05:51:37

标签: android casting sharedpreferences

全新安装APP后,我遇到以下异常:

dp.onEventClicked = function(args) {
 bootbox.alert(" " + args.e.text()); //Alert
};

(活动)代码:

初始化时间长(在onCreate之外):

java.lang.RuntimeException: Unable to start activity ... 
java.lang.ClassCastException: java.lang.Integer cannot be cast to 
java.lang.Long

从pefs-或默认为0L(在onCreate中)指定以前的长值:

long spinTimer = 0L;

应该很长,int来自何处?

其他代码引用,其中sharepref获取其值(全长):

spinTimer = settings.getLong("spinTimer", 0L);

清除APP数据后,一切都很好。每次我重新安装APP时都不应该这样做。

世界上是如何偷偷溜进去的?

请求DEBUG INFO - 不标准,但认为这应该足够了:

发生崩溃的相关代码行(简单活动):

if (item.equals("Select...")) {editor.putLong("spinTimer", 0L);}
if (item.equals("5 mins")) {editor.putLong("spinTimer", System.currentTimeMillis() + (5 * 60 * 1000));}
if (item.equals("10 mins")) {editor.putLong("spinTimer", System.currentTimeMillis() + (10 * 60 * 1000));}
if (item.equals("15 mins")) {editor.putLong("spinTimer", System.currentTimeMillis() + (15 * 60 * 1000));}
if (item.equals("30 mins")) {editor.putLong("spinTimer", System.currentTimeMillis() + (30 * 60 * 1000));}
if (item.equals("1 hour")) {editor.putLong("spinTimer", System.currentTimeMillis() + (60 * 60 * 1000));}
editor.commit();
spinTimer = settings.getLong("spinTimer", 0L);

输出:

log.debug("***Activity Start***");
log.debug("OnCreateEnter");
SharedPreferences settings = 
PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
SharedPreferences.Editor editor = settings.edit();
log.debug("spinTimer: {}", spinTimer);
spinTimer = settings.getLong("spinTimer", 0L); // <-- APP crashes right here

1)如果没有分配任何内容,是否应该将.getLong(0L)的第二个参数赋值给变量(spinTimer)?我也试过'0'。

2)如何分配int?键'spinTimer'(0L)和var'spinTimer'('long spinTimer = 0L;')都被初始化为long。

3)如果我清除APP数据(全新安装后) - 一切都很好;

4)如果我在上述陈述之前添加以下代码行 - 一切顺利(但这种方法偏向于我的逻辑):

***Activity Start***
OnCreateEnter
spinTimer: 0

1 个答案:

答案 0 :(得分:2)

java.lang.ClassCastException: java.lang.Integer cannot be cast to 
java.lang.Long

由于 ClassCastException 问题,您应该使用Long.valueOf

  

返回表示指定long值的Long实例。如果一个   新的Long实例不是必需的,这个方法一般应该是   优先使用构造函数Long(long),就像这个方法一样   可能会产生明显更好的空间和时间表现   缓存频繁请求的值。注意,不像   在Integer类中对应的方法,不需要此方法   缓存特定范围内的值。

editor.putLong("spinTimer", Long.valueOf(System.currentTimeMillis() + (5 * 60 * 1000))