У меня есть один загрузчик, используемый в действии. Я могу запустить загрузчик, и он вызывается onLoadFinished. Когда я обновляю данные и звоню onContentChanged
в загрузчике, я вижу, что вызываются loadInBackground
и deliverResult
. Здесь тропа останавливается. Я не получаю никакого обратного вызова до onLoadFinished
.Loader: onLoadFinished, вызываемый только один раз
Если я воссоздаю действие (иначе изменение ориентации или перезапуск), то он будет вести себя одинаково.
Я использую диспетчер загрузчика и загрузчика support-v4.
Мои SharedPreferenceLoader
на основе 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();
}
}
Вот как используется загрузчик:
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) {
}
}
Обновление Я нашел это в LoaderManager источнике. Похоже, что вызов onLoadFinished
не вызывается, если данные имеют одинаковую ссылку.
+1 для обновления. Я не был уверен, почему мой onLoadFinished не называется. Спасибо большое – Meher