0

Nach dem Klicken auf die Schaltfläche muss ich warten, bis einige Informationen in SharedPreferences gespeichert werden und dann in die nächste Aktivität weitergehen. Ich versuche, SharedPreferences.OnSharedPreferenceChangeListener() zu verwenden, aber es funktioniert nicht richtig.Speichern in SharedPreferences Callback

MapActivity

button.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       if (currentPosition != null) { 
        SharedPreferences preferences = PreferenceHelper.getPreferences(MapActivity.this); 
        SharedPreferences.OnSharedPreferenceChangeListener preferenceChangeListener = new SharedPreferences.OnSharedPreferenceChangeListener() { 
         @Override 
         public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) { 
          Log.i(TAG,"key "+key); 
          Intent i = new Intent(MapActivity.this, MainActivity.class); 
          i.putExtra("coordinates", currentPosition); 
          i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP); 
          startActivity(i); 
         } 
        }; 
        preferences.registerOnSharedPreferenceChangeListener(preferenceChangeListener); 
        PreferenceHelper.saveLocation(MapActivity.this,currentPosition); 
       } 
      } 
     }); 

PreferencesHelper

public class PreferenceHelper { 
       public static SharedPreferences appPreference; 

       public static SharedPreferences getPreferences(Context context){ 

       return context.getSharedPreferences(PREFERENCES_NAME,Context.MODE_PRIVATE); 
      } 

       public static void saveLocation(Context context,LatLng location){ 
        appPreference=context.getSharedPreferences(PREFERENCES_NAME,Context.MODE_PRIVATE); 
       SharedPreferences.Editor editor = appPreference.edit(); 
       editor.putFloat(CURRENT_LOCATION_X, (float) location.latitude).apply(); 
       editor.putFloat(CURRENT_LOCATION_Y, (float) location.longitude).apply(); 
       editor.commit(); 
      } 

      } 
+0

r u versucht, durch die PreferenceHelper.saveLocatio am oberen Rand der SharedPreferences.OnSharedPreferenceChangeListener zu erwähnen? – Bahu

+0

Ja ich versuche so – Expiredmind

Antwort

1

commiting ändert, ist etwas, das im Hauptthread passiert ... Sie brauchen keinen OnSharedPreferenceChangeListener. Der Änderungslistener ist nützlich, wenn Sie über Änderungen in Ihren freigegebenen Einstellungen benachrichtigt werden möchten, die von anderen Komponenten Ihrer Anwendung stammen, nicht von denen, die die Änderungen festgeschrieben haben. Just do:

prefs.edit().putWhatever().commit(); 
startActivity(new Intent(....)); 
+0

Ich habe den Code ohne OnSharedPreferenceChangeListener getestet und es funktioniert gut in Android 6.0, aber in älteren (4.2) haben ein Problem damit (es dauert Daten aus früheren Einsparungen, wie es mehr Zeit benötigt, bis es zu speichern). – Expiredmind

+1

Das könnte passieren, weil die Aktivität, die Sie starten, "schwer" ist. Das Speichern von zwei Gleitkommawerten kann diese Art von Folge nicht haben. Es sei denn, Ihre Voreinstellungsdatei ist so groß geworden, dass sie viel Zeit zum Speichern benötigt. In diesem Fall machen Sie etwas falsch und Sie sollten Ihre Daten auf eine andere Weise speichern ... z. Datenbank – Anonymous

Verwandte Themen