0

我保留了一个静态共享偏好来访问来自多个活动的值。

现在,我已经设置了在某个时间响起的闹钟。现在在那个广播接收器中,我正在尝试访问共享的 pref 变量。

它已经在另一个活动中初始化并在那里返回正确的值。

但是在这个广播接收器中,它没有给出实际值。它给出了未初始化的值。

既然它是静态的,值不应该保持不变吗?

这是共享偏好类。

package com.footballalarm.invincibles; 

import android.content.Context;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.util.Log;

public class SessionManagement {
// Shared Preferences
public static SharedPreferences pref;

// Editor for Shared preferences
public static Editor editor;

// Context
Context _context;

// Shared pref mode
int PRIVATE_MODE = 0;

// Shared pref file name
private static final String PREF_NAME = "invincibles_alarm";

// All Shared Preferences Key
public static final String PREF_MATCH = "match";

// Constructor
public SessionManagement(Context context){
    this._context = context;
    pref = _context.getSharedPreferences(getPrefName(), PRIVATE_MODE);
     editor = pref.edit();
     editor.commit();
     Log.e("Pref Match Value-constructor for pref", getValueMatch());
}

public static void fillValues(String match){
try{// Storing login value as TRUE
    editor.putString(PREF_MATCH, match);

    // commit changes
    editor.commit();
  Log.e("Pref Match Value-in fill values", getValueMatch());
}
catch(Exception e)
{Log.e("fillValues", e.toString());}

}   

public static String getValueMatch(){       
    return pref.getString(PREF_MATCH, "Loading Match"); 
}
public static String getPrefName() {
    return PREF_NAME;
}

}

我试图在其他活动中记录输出并正确返回。

当我运行应用程序然后在警报发生之前将其关闭时,由于广播接收器无法访问共享首选项,程序会因空指针异常而崩溃。

我已经尝试过这个解决方案 - BroadcastReceiver 中的 SharedPreferences 似乎没有更新?但我只在清单中为接收者使用名称。

仅当我通过最小化菜单在 ICS 中关闭我的应用程序时才会发生这种情况。

4

1 回答 1

1

检查此链接:

静态变量失去价值

在您的情况下,静态变量可能正在失去其价值

静态变量在以下情况下可能会失去价值:

1)类被卸载。

2) JVM 关闭。

3) 进程终止。

不要使用静态变量和函数,而是尝试使用公共类

希望能帮助到你

编辑1:

使用公共类而不是静态方法的首选项示例代码

public class PreferenceForApp {
    Context context;
    SharedPreferences prefs;

    public PreferenceForApp(Context context) {
        this.context = context;
        prefs = context.getSharedPreferences(AllConstants.PREFS_NAME, 0);
    }



    public Boolean getIsDeviceValidated() {

        return prefs.getBoolean("Validated", false);
    }

    public void setIsDeviceValidated(Boolean value) {

        SharedPreferences.Editor editor = prefs.edit();
        editor.putBoolean("Validated", value);
        editor.commit();
    }


}

在您的代码中添加:

PreferenceForApp myPref = new PreferenceForApp(contxt);
myPref.getIsDeviceValidated();

有用的相关链接:

Android 静态对象生命周期

为什么静态变量被认为是邪恶的?

Android:内存不足的静态变量null

编辑 2

测试您的静态变量何时失去价值:

您可以使用几行代码对此进行测试:

  • 在活动的 onCreate 中打印未初始化的静态 -> 应该打印 null

  • 初始化静态。打印它 -> 值将不为空

  • 点击后退按钮并转到主屏幕。注意:主屏幕是另一个活动。

  • 再次启动您的活动 -> 静态变量将不为空

  • 从 DDMS(设备窗口中的停止按钮)中终止您的应用程序进程。

  • 重新启动您的活动-> 静态将具有空值。

我提到了这个链接Android静态对象生命周期

于 2013-07-15T08:27:41.713 回答