ClassCastException java .lang.Integer не может быть приведен к java .lang.Long при получении значения Shared Preference - PullRequest
0 голосов
/ 17 января 2020

Я получаю

java .lang.ClassCastException: java .lang.Integer не может быть приведен к java .lang.Long

исключение при получении значения по умолчанию Shared Preference, если значение не присутствует в предпочтении. Ниже мой код.

public long getLongSharedValue(String key, long def) {
        SharedPreferences settings = context.getSharedPreferences(
                context.getApplicationInfo().packageName + "_prefs", Context.MODE_PRIVATE);
        return settings.getLong(key, def); // Error is logged here...
    }

Может кто-нибудь помочь мне в решении проблемы. Я попытался преобразовать принудительное приведение типов, как показано ниже:

return settings.getLong(key, Long.valueOf(def));

, но проблема по-прежнему возникает.

Журнал ошибок выглядит следующим образом:

java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.Long
        at android.app.SharedPreferencesImpl.getLong(SharedPreferencesImpl.java:249)
        at package-name.UtilityClass.getLongSharedValue(UtilityClass.java:104)
        at package-name.Fragment1.getPullData(Fragment1.java:130)
        at package-name.Fragment1.onCreateView(Fragment1.java:107)
        at androidx.fragment.app.Fragment.performCreateView(Fragment.java:2600)
        at androidx.fragment.app.FragmentManagerImpl.moveToState(FragmentManagerImpl.java:881)
        at androidx.fragment.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManagerImpl.java:1238)
        at androidx.fragment.app.FragmentManagerImpl.moveToState(FragmentManagerImpl.java:1303)
        at androidx.fragment.app.BackStackRecord.executeOps(BackStackRecord.java:439)
        at androidx.fragment.app.FragmentManagerImpl.executeOps(FragmentManagerImpl.java:2079)
        at androidx.fragment.app.FragmentManagerImpl.executeOpsTogether(FragmentManagerImpl.java:1869)
        at androidx.fragment.app.FragmentManagerImpl.removeRedundantOperationsAndExecute(FragmentManagerImpl.java:1824)
        at androidx.fragment.app.FragmentManagerImpl.execPendingActions(FragmentManagerImpl.java:1727)
        at androidx.fragment.app.FragmentManagerImpl$2.run(FragmentManagerImpl.java:150)
        at android.os.Handler.handleCallback(Handler.java:751)
        at android.os.Handler.dispatchMessage(Handler.java:95)
        at android.os.Looper.loop(Looper.java:154)
        at android.app.ActivityThread.main(ActivityThread.java:6119)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)

I Я использую метод в моем приложении как:

    long id = mUtility.getLongSharedValue(Constants.SharedPreferencesKeys.USER_ID, 0);
//long id = mUtility.getLongSharedValue(Constants.SharedPreferencesKeys.USER_ID, 0L); // Tried this as well but same issue is perishing...

Ответы [ 2 ]

1 голос
/ 17 января 2020

Фрагмент кода SharedPreferencesImpl:

public long getLong(String key, long defValue) {
    synchronized (mLock) {
        awaitLoadedLocked();
        Long v = (Long)mMap.get(key); 
        return v != null ? v : defValue;
    }
}

, так что предположительно имеется целое число на карте.

Если вам нужна длинная попытка

try {
    return settings.getLong(key, def);
}
catch (ClassCastException e) {
    int val = settings.getInt(key,0);
    return (val == 0) ? def : Long.valueOf(val);
}

Редактировать: это не удастся, если карта содержит 0, def будет возвращено, без проблем в вашем случае, но ...

1 голос
/ 17 января 2020

Когда вы передаете значение этому getLongSharedValue (String, long), убедитесь, что второе значение параметра, которое вы передаете, является длинным значением типа данных.

Поскольку Log.valueOf () принимает в основном два типа параметра, либо строка или long.

Поскольку он не работает для u, кажется, что значение, переданное второму параметру getLongSharedValue (String, long), не является длинным значением.

...