7

У меня есть один загрузчик, используемый в действии. Я могу запустить загрузчик, и он вызывается 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

+1 для обновления. Я не был уверен, почему мой onLoadFinished не называется. Спасибо большое – Meher

ответ

4

Да, похоже, что с текущей реализацией LoaderManager SharedPreferencesLoader довольно сильно завинчен. Я осуждаю это.

Спасибо, что указали это!

+0

Ha! Потрясающие. Спасибо, и я ценю честность. Я закончил создание StringPreferenceLoader. Это касается моих потребностей, но это хорошо работает. https://github.com/sababado/CustomLoaders – Sababado

Смежные вопросы