0

點擊按鈕後,我需要等到某些信息將被存儲在SharedPreferences,然後繼續下一個活動。我嘗試使用SharedPreferences.OnSharedPreferenceChangeListener(),但它無法正常工作。保存在SharedPreferences回調

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你試着通過在SharedPreferences.OnSharedPreferenceChangeListener的頂部提到PreferenceHelper.saveLocatio? – Bahu

+0

是的,我嘗試這種方式 – Expiredmind

回答

1

Commiting改變的是事情發生在主線程...你不需要OnSharedPreferenceChangeListener。當您希望收到有關從您的應用程序的其他組件提交的共享首選項更改的通知時,更改偵聽器非常有用......而不是提交更改的那個。只要這樣做:

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

我已經測試了代碼沒有OnSharedPreferenceChangeListener,它在Android 6.0中工作正常,但在較舊的(4.2)有一個問題(它需要從以前的儲蓄數據,像它需要更多的時間,直到保存它)。 – Expiredmind

+1

這可能會發生,因爲你重新開始的活動是「沉重的」。保存兩個浮點值不能有這種類型的順序。除非您的偏好文件變得如此之大,以致需要大量時間進行保存。在這種情況下,你做錯了事情,你應該以不同的方式保存你的數據......例如,數據庫 – Anonymous