静态SharedPref在广播接收器中提供未初始化的值

时间:2013-07-15 08:20:14

标签: android broadcastreceiver sharedpreferences

我保留了一个静态共享首选项来访问多个活动中的值。

现在,我已经设定了警报,以便在某个时间起飞。现在在那个广播接收器中,我正在尝试访问共享的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;
}

}

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

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

我已经尝试过这个解决方案 - SharedPreferences in BroadcastReceiver seems to not update?但我只是在清单中使用名字给接收者。

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

1 个答案:

答案 0 :(得分:1)

检查此链接:

Static variable loses value

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

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

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 static object lifecycle

Why are static variables considered evil?

Android : Static variable null on low memory

编辑2

TEST 当您的静态变量丢失值时:

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

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

  • 初始化静态。打印它 - > value将为非null

  • 点击后退按钮,进入主屏幕。注意:主屏幕是另一项活动。

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

  • 从DDMS(设备窗口中的停止按钮)终止您的申请流程。

  • 重新开始您的活动 - > static将具有null值。

我提到了这个链接Android static object lifecycle