[英]Using SharedPreferences to save variable makes my app crash
当应用程序关闭或启动时,我正在使用SharedPreferences
来保存和获取我的变量到我的应用程序。
我对所有变量使用相同类型的方法/代码并且它有效,除了一个变量。
我想问题可能在于这个变量也被编程为在每天的特定时间重置为 = 0。 (我为此使用 BroadcastReceiver)。
由于这是我在特定时间重置的唯一变量,并且当我尝试使用 SharedPreferences 保存它时,同一个变量会崩溃,因此这两件事可能会让我的应用程序生气。
SharedPreferences settings2= getSharedPreferences(PREFS_NAME,0);
特别是下面这行代码似乎使应用程序崩溃
dosesTaken = settings2.getInt("dosesTaken",dosesTaken);
这是“BroadcastReciver”的类
import ...
public class AlarmResetTaken extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
MainActivity.dosesTaken = 0;
MainActivity.setDosage();
Activity2.takenDoseText.setText (Integer.toString(MainActivity.dosesTaken));
}
}
这是 MainActivity 中“BroadcastReciver”的方法
private void setAlarmResetDose(long timeInMillis) {
AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
Intent intent = new Intent(this, AlarmResetTaken.class);
PendingIntent pendingIntent = PendingIntent.getBroadcast(this,0,intent,0);
alarmManager.setRepeating(AlarmManager.RTC, timeInMillis, AlarmManager.INTERVAL_DAY, pendingIntent);
}
以及设置具体复位时间的方法。
public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
timeDoseResetHour = hourOfDay;
timeDoseResetMin = minute;
timeDoseResetText.setText( String.format("%02d",hourOfDay) +" : " + String.format("%02d",minute));
Calendar calendar = Calendar.getInstance();
calendar.set(
calendar.get(Calendar.YEAR),
calendar.get(Calendar.MONTH),
calendar.get(Calendar.DAY_OF_MONTH),
hourOfDay,
minute,
0
);
setAlarmResetDose(calendar.getTimeInMillis()); }
这是我得到的错误:
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.dex, PID: 28325
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.dex/com.example.dex.MainActivity}: java.lang.ClassCastException: java.lang.Long cannot be cast to java.lang.Integer
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2913)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3048)
at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:78)
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1808)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:193)
at android.app.ActivityThread.main(ActivityThread.java:6669)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
Caused by: java.lang.ClassCastException: java.lang.Long cannot be cast to java.lang.Integer
at android.app.SharedPreferencesImpl.getInt(SharedPreferencesImpl.java:302)
at com.example.dex.MainActivity.onCreate(MainActivity.java:92)
at android.app.Activity.performCreate(Activity.java:7136)
at android.app.Activity.performCreate(Activity.java:7127)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1271)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2893)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3048)
at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:78)
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1808)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:193)
at android.app.ActivityThread.main(ActivityThread.java:6669)
从您发布的错误来看,
java.lang.ClassCastException: java.lang.Long cannot be cast to java.lang.Integer
似乎, dosesTaken
的类型是Long
而不是int
。 因此,当您尝试获取名称为dosesTaken
的 Integer 时,它会抛出错误。
因此,要解决错误,要么更改
settings2.getInt("dosesTaken",dosesTaken);
到
settings2.getLong("dosesTaken",dosesTaken);
或者
将dosesTaken
的类型dosesTaken
为int
。
改变这个 - :
settings2.getInt("dosesTaken",dosesTaken);
到-:
settings2.getLong("dosesTaken",dosesTaken);
服用的剂量类型是否长? 如果是,很可能它被保存为 long,现在您试图将它作为 int 检索,这会导致 ClassCastException。 尝试清除您的共享首选项并重新运行该应用程序。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.