7

Ho un caricatore utilizzato in un'attività. Sono in grado di avviare il caricatore e viene chiamato onLoadFinished. Quando aggiorno i dati e chiamo il numero onContentChanged nel caricatore, vedo che sono chiamati loadInBackground e deliverResult. Questo è dove il sentiero sembra fermarsi. Non ricevo alcuna richiamata su onLoadFinished.Loader: onLoadFinished chiamato solo una volta

Se si ricrea l'attività (ovvero il cambio di orientamento o il riavvio), si comporterà allo stesso modo.

Sto utilizzando il caricatore di supporto-v4 e gestore di caricatore.

mio SharedPreferenceLoader basa su 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(); 
    } 
} 

Ecco come viene utilizzato il caricatore:

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) { 
    } 
} 

Aggiornamento Ho trovato questo nella fonte LoaderManager. Sembra che la chiamata a onLoadFinished non venga chiamata se i dati hanno lo stesso riferimento.

+1

+1 per l'aggiornamento. Non ero sicuro del motivo per cui il mio onLoadFinished non viene chiamato. Grazie mille – Meher

risposta

4

Sì, sembrerebbe che con l'attuale implementazione di LoaderManager, SharedPreferencesLoader sia praticamente avvitato. Lo svaluterò.

Grazie per aver segnalato questo!

+0

Ha! Eccezionale. Grazie e apprezzo l'onestà. Ho finito per creare un oggetto StringPreferenceLoader. Questo è specifico per le mie esigenze, ma fa bene il lavoro. https://github.com/sababado/CustomLoaders – Sababado

Problemi correlati