我在一个活动中使用了一个加载器.我能够启动加载器并调用onLoadFinished.当我更新数据并onContentChanged
在加载器中调用时,我看到loadInBackground
并且deliverResult
都被调用.这是小道似乎停止的地方.我没有收到任何回调onLoadFinished
.
如果我重新创建活动(也就是方向更改或重新启动),那么它将以相同的方式运行.
我正在使用support-v4加载器和加载器管理器.
我SharedPreferenceLoader
基于CommonsWare的加载器:
public class SharedPreferencesLoader extends AsyncTaskLoaderimplements 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{ 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 onCreateLoader(int i, Bundle bundle) { return new SharedPreferencesLoader(this); } @Override public void onLoadFinished(final Loader sharedPreferencesLoader, final SharedPreferences sharedPreferences) { final List locations = SharedPreferencesUtils.getLocations(sharedPreferences, this); Log.v(TAG, "wol: on load finished: "+locations); /* Do something with data. */ } @Override public void onLoaderReset(final Loader sharedPreferencesLoader) { } }
更新
我在LoaderManager源代码中发现了这个.onLoadFinished
如果数据具有相同的引用,则看起来好像没有调用call .