7

Ich habe einen Lader in einer Aktivität verwendet. Ich kann den Loader starten und onLoadFinished wird aufgerufen. Wenn ich Daten aktualisiere und onContentChanged im Loader anrufe, sehe ich, dass loadInBackground und deliverResult beide aufgerufen werden. Hier scheint die Spur anzuhalten. Ich bekomme keinen Rückruf an onLoadFinished.Loader: onLoadFinished nur einmal aufgerufen

Wenn ich die Aktivität neu erstellen (auch als Orientierungsänderung oder Relaunch), verhält es sich genauso.

Ich benutze den Support-v4 Loader und Loader Manager.

Mein SharedPreferenceLoader basierend auf CommonsWare's loader:

public class SharedPreferencesLoader extends AsyncTaskLoader<SharedPreferences> 
     implements SharedPreferences.OnSharedPreferenceChangeListener { 
    private SharedPreferences prefs = null; 

    private static final String TAG = SharedPreferencesLoader.class.getSimpleName(); 

    public SharedPreferencesLoader(Context context) { 
     super(context); 
    } 

    @Override 
    public SharedPreferences loadInBackground() { 
     Log.v(TAG, "wol: load in background"); 
     prefs = PreferenceManager.getDefaultSharedPreferences(getContext()); 
     prefs.registerOnSharedPreferenceChangeListener(this); 

     return (prefs); 
    } 

    @Override 
    protected void onStartLoading() { 
     if (prefs != null) { 
      deliverResult(prefs); 
     } 

     if (takeContentChanged() || prefs == null) { 
      forceLoad(); 
     } 
    } 

    @Override 
    public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) { 
     Log.v(TAG, "wol: on shared preference changed."); 
     onContentChanged(); 
    } 
} 

Hier ist, wie der Lader benutzt wird:

public class MainActivity extends ActionBarActivity implements 
     LoaderManager.LoaderCallbacks<SharedPreferences> { 
    private static final String TAG = MainActivity.class.getSimpleName(); 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     getSupportLoaderManager().initLoader(0, null, this); 
     // fetch list of locations through an intent service. 
     // This will save data to shared preferences and trigger onContentChanged 
     MyIntentService.startActionGetLocations(this); 
    } 

    @Override 
    public Loader<SharedPreferences> onCreateLoader(int i, Bundle bundle) { 
     return new SharedPreferencesLoader(this); 
    } 

    @Override 
    public void onLoadFinished(final Loader<SharedPreferences> sharedPreferencesLoader, final SharedPreferences sharedPreferences) { 
     final List<PwStructure> locations = SharedPreferencesUtils.getLocations(sharedPreferences, this); 
     Log.v(TAG, "wol: on load finished: "+locations); 
     /* Do something with data. */ 
    } 

    @Override 
    public void onLoaderReset(final Loader<SharedPreferences> sharedPreferencesLoader) { 
    } 
} 

aktualisieren ich dies in der LoaderManager Quelle gefunden. Es sieht so aus, als ob der Aufruf an onLoadFinished nicht aufgerufen wird, wenn die Daten die gleiche Referenz haben.

+1

+1 für das Update. Ich war mir nicht sicher, warum mein onLoadFinished nicht genannt wird. Vielen Dank – Meher

Antwort

4

Ja, es scheint, dass mit der aktuellen LoaderManager-Implementierung SharedPreferencesLoader ziemlich verschraubt ist. Ich werde es ablehnen.

Vielen Dank für das Aufzeigen!

+0

Ha! Genial. Danke und ich schätze die Ehrlichkeit. Ich habe schließlich einen StringPreferenceLoader erstellt. Dies ist spezifisch für meine Bedürfnisse, aber es macht die Arbeit gut. https://github.com/sababado/CustomLoaders – Sababado

Verwandte Themen