Tôi đang thay đổi và cam kết SharedPreference trong SyncAdapter sau khi đồng bộ hóa thành công, nhưng tôi không thấy giá trị cập nhật khi tôi truy cập tùy chọn trong Hoạt động của tôi (thay vì tôi thấy giá trị cũ). Tôi đang làm gì sai? Các bối cảnh khác nhau?SharedPreference được cam kết trong SyncAdapter không được cập nhật trong Hoạt động?
SyncAdapter của tôi, nơi tôi cập nhật các ưu tiên:
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();
}
}
}
Các dịch vụ khởi tạo SyncAdapter với 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();
}
}
Một chức năng tĩnh trong ứng dụng gọi bằng các Hoạt động để kiểm tra các SharedPreference. Điều này không trả về giá trị đã cam kết trong SyncAdapter, mà là giá trị cũ. (SettingsActivity My và các hoạt động khác cũng sử dụng giá trị cũ.):
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;
}
UPDATE: Tôi nhận được giá trị mới khi tôi hoàn toàn đóng ứng dụng (swipe nó từ các ứng dụng đang chạy). Tôi cũng có một SharedPreferenceChangeListener, nó không được kích hoạt khi tùy chọn được cập nhật.
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);
}
Từ mã bạn đã đăng, có vẻ như bạn không bao giờ gọi 'startSync()' trên 'SyncAdapter' có nghĩa là phương thức' onPerformSync (...) 'không thực thi và sở thích không bao giờ thay đổi. – Titus
@Titus Một nơi nào đó tôi làm và 'onPerformSync()' chắc chắn được thực hiện. Nó cũng sử dụng giá trị mới trong các đồng bộ tiếp theo. Tôi đã phát hiện ra rằng 'SyncService' đang chạy trong một quá trình riêng biệt (''). Bây giờ tôi đang cố gắng tìm ra cách sử dụng 'MODE_MULTI_PROCESS' với' PreferenceManager.getDefaultSharedPreferences() '. –
matsch
Bạn có thể sử dụng 'prefs = mContext.getSharedPreferences (" myAppPrefs ", Context.MODE_MULTI_PROCESS);' [Here] (http://developer.android.com/reference/android/content/Context.html#getSharedPreferences (java.lang .String, int)) là tài liệu. – Titus