簡體   English   中英

使用 SharedPreferences 保存變量使我的應用程序崩潰

[英]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的類型dosesTakenint

改變這個 - :

settings2.getInt("dosesTaken",dosesTaken);

到-:

settings2.getLong("dosesTaken",dosesTaken);

服用的劑量類型是否長? 如果是,很可能它被保存為 long,現在您試圖將它作為 int 檢索,這會導致 ClassCastException。 嘗試清除您的共享首選項並重新運行該應用程序。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM