在不同的线程

时间:2015-10-23 12:45:46

标签: java android sharedpreferences

在我的应用程序中,登录后我将在userPreference文件中保存用户详细信息(如userName,Id,email等),以便我可以在我的应用程序中的任何位置访问它们, 我这样做是

public void put(String fileName, String key, String value)
{
    SharedPreferences sharedPref = getContext().getSharedPreferences(fileName, Context.MODE_PRIVATE);
    SharedPreferences.Editor editor = sharedPref.edit();
    editor.putString(key, value);
    editor.commit();
}

现在我已经产生了一个不同的线程,它将独立运行(类似于Sync),我正在访问这样的sharedPreference,

mContext.getSharedPreferences(fileName, Context.MODE_PRIVATE);

但是这个特殊偏好中的所有值都返回为null,我做错了什么,

PS: - 如果我杀了应用程序并再次生成相同的线程,我可以访问这些值(它很奇怪,但这种情况正在发生,即当用户第一次登录时,这些细节无法访问)

感觉与SharedPreferences同步问题,任何人都可以帮忙解决这个问题吗?

4 个答案:

答案 0 :(得分:4)

我认为你选择了正确的方法。实际访问共享首选项只是对/data/data/pkg_name/preferences中存储的XML文件的I / O操作。因此,如果您想在除UI之外的其他线程中访问它,那么它真的很有意义。

但是,您应该确保在共享首选项的每个操作之后,您应该提交基础层中的更改。首先,你应该注意differences between apply() and commit()

因此,您应首先提交更改,然后可以通过其他线程访问它。

答案 1 :(得分:1)

MODE_PRIVATE更改为MODE_WORLD_READABLE

答案 2 :(得分:1)

我前段时间尝试从自己的流程中运行的服务访问我的average = ((double) total / count); 时遇到同样的问题。以下是我如何解决它:

MultiProcessShared示例:

SharedPreference

}

My App SharedPreferences具体实现:

public class GenericSharedPreferences {
public static final String TAG = GenericSharedPreferences.class.getSimpleName();

//region Logger
public static Logger sLogger;

static {
    sLogger = Logger.getLogger(TAG);
    if (BuildConfig.DEBUG)
        sLogger.setLevel(Level.ALL);
    else
        sLogger.setLevel(Level.OFF);
}
//endregion

public static MultiProcessShared.MultiProcessSharedPreferences getMultiProcessSharedReader(Context context) {
    return MultiProcessShared.getDefaultSharedPreferences(context);
}

public static MultiProcessShared.Editor getMultiProcessSharedWriter(Context context) {
    return MultiProcessShared.getDefaultSharedPreferences(context).edit();
}

public class MyAppSharedPreferences extends GenericSharedPreferences { ... //region Country private static final String SHARED_APP_COUNTRY = "shared-app-country"; public static Country getCountry() { String isoCode = getMultiProcessSharedReader(MyApp.getInstance()).getString(SHARED_APP_COUNTRY); CountryEnum countryEnum = CountryEnum.fromIso(isoCode); if (countryEnum == null) return null; return countryEnum.getCountry(); } public static void setCountry(String isoCode) { if (TextUtils.isEmpty(isoCode)) getMultiProcessSharedReader(MyApp.getInstance()).removeString(SHARED_APP_COUNTRY); else getMultiProcessSharedWriter(MyApp.getInstance()).putString(SHARED_APP_COUNTRY, isoCode); } //endregion ... } 是我在AndroidManifext.xml中关联的应用程序

有任何问题,请随时提出!

答案 3 :(得分:0)

正在访问共享首选项的线程被证明是在一个在不同进程中运行的服务中,

因此,将共享偏好设置模式更改为MODE_MULTI_PROCESS而非MODE_PRIVATE效果非常好,

现在我可以正常访问共享偏好

感谢所有试过的人!