成功同步后,我正在更改并在SyncAdapter中提交SharedPreference,但在访问我的Activity中的首选项时(而非看到旧值),我没有看到更新的值。我究竟做错了什么?不同的上下文?在SyncAdapter中提交的SharedPreference未在Activity中更新?
我SyncAdapter,我更新偏好:
class SyncAdapter extends AbstractThreadedSyncAdapter {
private int PARTICIPANT_ID;
private final Context mContext;
private final ContentResolver mContentResolver;
public SyncAdapter(Context context, boolean autoInitialize) {
super(context, autoInitialize);
mContext = context;
mContentResolver = context.getContentResolver();
}
public SyncAdapter(Context context, boolean autoInitialize, boolean allowParallelSyncs) {
super(context, autoInitialize, allowParallelSyncs);
mContext = context;
mContentResolver = context.getContentResolver();
}
@Override
public void onPerformSync(Account account, Bundle extras, String authority,
ContentProviderClient provider, SyncResult syncResult) {
final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(mContext);
PARTICIPANT_ID = Integer.parseInt(prefs.getString("participant_id", "0"));
if (success) {
// save and set the new participant id
PARTICIPANT_ID = newParticipantId;
prefs.edit().putString("participant_id", String.valueOf(newParticipantId)).commit();
}
}
}
的服务初始化SyncAdapter用的ApplicationContext:
public class SyncService extends Service {
private static final Object sSyncAdapterLock = new Object();
private static SyncAdapter sSyncAdapter = null;
@Override
public void onCreate() {
synchronized (sSyncAdapterLock) {
if (sSyncAdapter == null) {
sSyncAdapter = new SyncAdapter(getApplicationContext(), false);
}
}
}
@Override
public IBinder onBind(Intent intent) {
return sSyncAdapter.getSyncAdapterBinder();
}
}
通过检查SharedPreference活动称为应用程序中的静态函数。这不会返回SyncAdapter中提交的值,而是旧值。 (我SettingsActivity等活动也使用旧值。):
public static boolean isUserLoggedIn(Context ctx) {
final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(ctx);
int participantId = Integer.parseInt(prefs.getString("participant_id", "0"));
LOGD("dg_Utils", "isUserLoggedIn.participantId: " + participantId);// TODO
if (participantId <= 0) {
ctx.startActivity(new Intent(ctx, LoginActivity.class).addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP));
return false;
}
return true;
}
更新:我收到的时候我完全关闭该应用程序(从应用程序运行刷卡吧)的新值。我还有一个SharedPreferenceChangeListener,当更新首选项时不会触发它。
private final SharedPreferences.OnSharedPreferenceChangeListener mParticipantIDPrefChangeListener = new SharedPreferences.OnSharedPreferenceChangeListener() {
public void onSharedPreferenceChanged(SharedPreferences prefs, String key) {
if (key.equals("participant_id")) {
LOGI(TAG, "participant_id has changed, requesting to restart the loader.");
mRestartLoader = true;
}
}
};
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
// subscribe to the participant_id change lister
final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getActivity());
PARTICIPANT_ID = Integer.parseInt(prefs.getString("participant_id", "0"));
prefs.registerOnSharedPreferenceChangeListener(mParticipantIDPrefChangeListener);
}
从你已经发布的代码似乎你从来没有叫'startSync()'的'SyncAdapter'这意味着'onPerformSync(...)'方法不执行和偏好从不改变。 – Titus 2014-10-16 16:10:10
@Titus我在某处执行'onPerformSync()'是肯定执行的。它也在随后的同步中使用新值。我发现'SyncService'运行在一个单独的进程中('”)。现在我正试图弄清楚如何在'PreferenceManager.getDefaultSharedPreferences()'中使用'MODE_MULTI_PROCESS'。 –
matsch
2014-10-16 16:18:28
您可以使用'prefs = mContext.getSharedPreferences(“myAppPrefs”,Context.MODE_MULTI_PROCESS);'[Here](http://developer.android.com/reference/android/content/Context.html#getSharedPreferences(java.lang .String,int))是文档。 – Titus 2014-10-16 16:26:53