Android:当我尝试访问布尔值SharedPreference时,它会返回有关将字符串转换为布尔值

时间:2016-08-24 07:52:04

标签: java android android-studio exception casting

  

AGAIN:第36行是:ToPushVar = mPrefs.getBoolean(“PushNotifications”,true);

我今天开始创建一个简单的rss阅读器。我想将设置存储在共享首选项中。这是我的保存代码(使用alertdialogs进行调试):

  public void toSave(View v) {
    SharedPreferences prefs = getSharedPreferences(
            "bdapps.ujsag_frisshirekatelefonodon",  Context.MODE_PRIVATE);
    String NewsPaperSetting;
        boolean ToPush = ((Switch)findViewById(R.id.pushNotifications)).isChecked();
        boolean Newspaper =( (Switch)findViewById(R.id.integratedReader)).isChecked();
        SharedPreferences.Editor mEditor = prefs.edit();
        mEditor.clear();
        mEditor.putBoolean("PushNotifications", ToPush);
        mEditor.putBoolean("UseReader", Newspaper);
        mEditor.apply();
    AlertDialog alertDialog = new AlertDialog.Builder(this).create();
    alertDialog.setTitle("Változók értékei:");
    alertDialog.setMessage("Mentés:" + ToPush + Newspaper);
    alertDialog.show();
    SharedPreferences mPrefs = getSharedPreferences("bdapps.ujsag_frisshirekatelefonodon", 0);
    boolean SendNotifications, UseBDReader;
    Boolean ToPushVar = mPrefs.getBoolean("PushNotifications", false);
    Boolean abc = mPrefs.getBoolean("PushNotifications", false);
    AlertDialog dia = new AlertDialog.Builder(this).create();
    dia.setTitle("Változók értékei:");
    dia.setMessage("Üzenetek küldése:" +ToPushVar + "  Olvasó: " + abc );
    dia.show();
}

调试表明它成功保存了带有true或false值的变量,但是当我重新启动应用程序时,它会出现以下错误:

  

引起:java.lang.ClassCastException:java.lang.String无法强制转换为java.lang.Boolean

我阅读价值观的方法:

public void RetrieveValues() {
    boolean ToPushVar;
    boolean Reader;

        SharedPreferences mPrefs = getSharedPreferences("bdapps.ujsag_frisshirekatelefonodon", 0);
        ToPushVar = mPrefs.getBoolean("PushNotifications", true); /* Here I got the error*/
        Reader = mPrefs.getBoolean("UseReader", false);
        AlertDialog alertDialog = new AlertDialog.Builder(this).create();
        alertDialog.setTitle("Változók értékei:");
        alertDialog.setMessage("Üzenetek küldése:" + ToPushVar + "  Olvasó: " + Reader);
        alertDialog.show();

    }

完整的堆栈跟踪:

8-24 10:04:04.068 6476-6476/bdapps.ujsag_frisshirekatelefonodon E/AndroidRuntime: FATAL EXCEPTION: main
 Process: bdapps.ujsag_frisshirekatelefonodon, PID: 6476
 java.lang.RuntimeException: Unable to start activity ComponentInfo{bdapps.ujsag_frisshirekatelefonodon/bdapps.ujsag_frisshirekatelefonodon.MainActivity}: java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Boolean
     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2699)
     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2773)
     at android.app.ActivityThread.access$900(ActivityThread.java:177)
     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1434)
     at android.os.Handler.dispatchMessage(Handler.java:102)
     at android.os.Looper.loop(Looper.java:135)
     at android.app.ActivityThread.main(ActivityThread.java:5930)
     at java.lang.reflect.Method.invoke(Native Method)
     at java.lang.reflect.Method.invoke(Method.java:372)
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1405)
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1200)
  Caused by: java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Boolean
     at android.app.SharedPreferencesImpl.getBoolean(SharedPreferencesImpl.java:260)
     at bdapps.ujsag_frisshirekatelefonodon.MainActivity.RetrieveValues(MainActivity.java:36)                                                                                       at bdapps.ujsag_frisshirekatelefonodon.MainActivity.onCreate(MainActivity.java:76)         at android.app.Activity.performCreate(Activity.java:6178)
     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1118)
     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2652)
     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2773) 
     at android.app.ActivityThread.access$900(ActivityThread.java:177) 
     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1434) 
     at android.os.Handler.dispatchMessage(Handler.java:102) 
     at android.os.Looper.loop(Looper.java:135) 
     at android.app.ActivityThread.main(ActivityThread.java:5930) 
     at java.lang.reflect.Method.invoke(Native Method) 
     at java.lang.reflect.Method.invoke(Method.java:372) 
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1405) 
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1200) 
  

我找到了解决方案。发生错误,因为还有其他数据类型(字符串)的值。我需要重新安装应用程序来修复它。感谢DsD!

5 个答案:

答案 0 :(得分:0)

在2.3中添加了

apply(),它提交时没有返回表示成功或失败的布尔值。

如果保存起作用,

commit()将返回true,否则返回false。

apply()被添加,因为Android开发团队注意到几乎没有人注意到返回值,因此apply更快,因为它是异步的。

答案 1 :(得分:0)

在onCreate方法中初始化按钮,如下所示

  Switch  btn_switch = (Switch) findViewById(R.id.pushNotifications);

然后在保存方法中使用它

 boolean ToPush = btn_switch.isChecked();

还尝试重建您的项目,有时它会修复主要问题

答案 2 :(得分:0)

根据android开发人员link,如果存在此名称不是布尔值的首选项,则getBoolean会抛出ClassCastException。因此,您可以通过更改“PushNotifications”键来检查,或者您可以卸载应用程序并再次安装。

答案 3 :(得分:0)

如果您正在运行模拟器。尝试运行新设备并进行检查。可能会正常工作。 如果您最初遇到字符串转换错误,后来又进行了更正,但在多次清理和重建项目后,该错误可能仍然存在。

重新安装也可以。 但是我在Nexus 6中收到错误消息,然后切换到Nexus 4并正常工作。

答案 4 :(得分:-1)

试试这个

SharedPreferences mPrefs = getSharedPreferences("bdapps.ujsag_frisshirekatelefonodon", 0);
    boolean SendNotifications, UseBDReader;
    boolean ToPushVar = mPrefs.getBoolean("PushNotifications", false);
    boolean abc = mPrefs.getBoolean("PushNotifications", false);

使用布尔代替布尔