7

アクティビティで使用されているローダーが 1 つあります。ローダーを開始でき、onLoadFinished が呼び出されます。データを更新onContentChangedしてローダーを呼び出すと、それが表示されloadInBackgrounddeliverResult両方が呼び出されます。ここでトレイルが停止するようです。へのコールバックがありませんonLoadFinished

アクティビティを再作成すると (別名、向きの変更または再起動)、同じように動作します。

support-v4 ローダーとローダー マネージャーを使用しています。

のCommonsWareのローダ​​ーSharedPreferenceLoaderに基づいています:

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データに同じ参照がある場合、への呼び出しが呼び出されないように見えます。

4

1 に答える 1

4

はい、現在の LoaderManager の実装では、SharedPreferencesLoader はかなりうまくいかないようです。私はそれを非推奨にします。

これを指摘してくれてありがとう!

于 2013-12-16T23:25:51.957 に答える