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 für das Update. Ich war mir nicht sicher, warum mein onLoadFinished nicht genannt wird. Vielen Dank – Meher