【问题标题】:Android java.lang.Long cannot be cast to java.lang.StringAndroid java.lang.Long 无法转换为 java.lang.String
【发布时间】:2021-09-12 19:58:47
【问题描述】:

好的,所以我使用

在我的共享首选项中存储了很长的内容
e.putLong("startTime", SystemClock.uptimeMillis());

我是从分享偏好中得到的,比如

SHARED_PREFS = context.getSharedPreferences(LOCAL_PREF, MODE_PRIVATE);
long startTime = SHARED_PREFS.getLong("startTime", 0L); <-- Stack trace points to this line.

但我在某些设备上收到此错误,但不知道为什么,我根本不想将其转换为 String

java.lang.Long cannot be cast to java.lang.String

我发现的所有内容都指向尝试将其设置为 String 值,而我根本不想这样做,我正在尝试直接使用 long 值。

** 更新堆栈跟踪 **

Caused by: java.lang.ClassCastException: java.lang.Long cannot be cast to java.lang.String
        at android.app.SharedPreferencesImpl.getString(SharedPreferencesImpl.java:255)
        at com.tech.utility.Tools.refreshPrefs(Tools.java:193)
        at com.tech.activity.Menu_dashboard.onStart(Menu_dashboard.java:762)
        at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1340)
        at android.app.Activity.performStart(Activity.java:7191)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2920)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3032)
        at android.app.ActivityThread.-wrap11(Unknown)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1696)
        at android.os.Handler.dispatchMessage(Handler.java:105)
        at android.os.Looper.loop(Looper.java:164)
        at android.app.ActivityThread.main(ActivityThread.java:6940)
        at java.lang.reflect.Method.invoke(Method.java:-2)
        at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:327)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1374)

【问题讨论】:

  • @Carcigenicate 我更新了我的堆栈跟踪。

标签: android sharedpreferences


【解决方案1】:

如果您要使用read the docs,您会读到getLong 方法将:

如果此名称的首选项不长,则抛出 ClassCastException。

所以,在应用程序的其他地方,您一定调用过:

e.putLong("startTime", "someString");

【讨论】:

  • 哈哈.. 领先我 10 秒 ;)
  • 我只在整个应用程序中设置了一次,也就是我创建计时器的时候,之后它只与getLong一起使用
  • @MarkKeen at android.app.SharedPreferencesImpl.getString(SharedPreferencesImpl.java:255) 不是我的文件之一,之前的行是 startTime = SHARED_PREFS.getLong("startTime", 0L); ,所以我不确定它为什么会尝试以 String 的身份访问它
  • 可能您在应用程序的早期版本中设置了一些内容,并且设置仍然存在?你可以试试: A. 使用不同的变量名。 B. 卸载应用或清除所有应用数据,然后重试。
  • @user2101081 - 不是它的 AOSP 代码,它在运行时解析/调用,它不是公共 SDK 的一部分,它具有调用此代码的 SharedPreferences API。请参阅android.googlesource.com/platform/frameworks/base.git/+/master/… - SharedPreferencesImpl 拥有一个 Map&lt;String, Object&gt;,它只是根据请求的类型进行转换。只需在设置中清除应用中的数据/缓存,然后重试
【解决方案2】:

这有点晚了,但是对于那些仍然面临这个问题的人,只需在调用 get 方法之前用你需要的类型的值覆盖 SharedPreferences 中的这个值。也许之前在那里写过一个字符串(或其他类型)

【讨论】:

    猜你喜欢
    • 2021-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-22
    • 1970-01-01
    • 2013-12-23
    • 1970-01-01
    相关资源
    最近更新 更多