मैं सफल सिंक के बाद अपने सिंक एडाप्टर में एक साझा पेंशन बदल रहा हूं और कर रहा हूं, लेकिन जब मैं अपनी गतिविधि में वरीयता का उपयोग करता हूं तो मुझे अद्यतन मूल्य नहीं दिख रहा है (बल्कि मैं पुराना मान देख रहा हूं)। मैं क्या गलत कर रहा हूं? विभिन्न संदर्भ?SyncAdapter में साझा किया गया साझा प्राथमिकता गतिविधि में अपडेट नहीं की गई है?
मेरे 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();
}
}
}
सेवा ApplicationContext साथ SyncAdapter आरंभ:
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;
}
अद्यतन: मैं नया मान जब मैं पूरी तरह से ऐप्स को बंद (क्षुधा चलने से स्वाइप करें) हो रही है। मेरे पास एक SharePreferenceChangeListener भी है, जिसे वरीयता अद्यतन होने पर निकाल दिया नहीं जाता है।
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);
}
कोड है कि आप पोस्ट किया है से ऐसा लगता है कि आप कभी नहीं 'SyncAdapter' पर' startSync() 'फोन जिसका अर्थ है कि' onPerformSync (...) 'विधि निष्पादित और नहीं करता है वरीयता कभी नहीं बदला जाता है। – Titus
@ टिटस कहीं मैं करता हूं और 'onPerformSync()' निश्चित रूप से निष्पादित किया जाता है। यह बाद के syncs में नए मान का भी उपयोग करता है। मुझे पता चला है कि 'सिंक सेवा' एक अलग प्रक्रिया में चल रही है ('')। अब मैं 'ideManager.getDefaultSharedPreferences()' के साथ 'MODE_MULTI_PROCESS' का उपयोग करने का तरीका जानने का प्रयास कर रहा हूं। –
matsch
आप 'prefs = mContext.getSharedPreferences ("myAppPrefs", Context.MODE_MULTI_PROCESS) का उपयोग कर सकते हैं;' [यहां] (http://developer.android.com/reference/android/content/Context.html#getSharedPreferences (java.lang .Sring, int)) दस्तावेज है। – Titus