android - 装载机 : onLoadFinished called only once

标签 android android-support-library android-loader commonsware-cwac

我在一项 Activity 中使用了一个装载机。我能够启动加载程序并调用 onLoadFinished。当我更新数据并在加载程序中调用 onContentChanged 时,我看到 loadInBackgrounddeliverResult 都被调用了。这是踪迹似乎停止的地方。我没有收到任何对 onLoadFinished 的回调。

如果我重新创建 Activity (也称为方向更改或重新启动),那么它的行为方式将相同。

我正在使用 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

最佳答案

是的,在当前的 LoaderManager 实现中,SharedPreferencesLoader 似乎完全搞砸了。我会弃用它。

感谢您指出这一点!

关于android - 装载机 : onLoadFinished called only once,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20619026/

相关文章:

java - 正则表达式测试器找到所有 4 个匹配项,而 Java 代码仅找到 3 个匹配项

android - 无法通过 Gmail 以编程方式发送带附件的电子邮件

java - 我可以为每个 fragment 单独提供工具栏吗?如何处理抽屉导航

android - LoaderManager.restartLoader() 是否总是会导致调用 onCreateLoader()?

java - 在 onCreateLoader() 方法中设置 ListView 对象的属性

android - 如何正确停止loader?

java - Android 中的 IllegalArgumentException

java - 从maven导入自己的项目时出错

Android DialogFragment 不会关闭

android - 具有相同 key 的多个条目 : FirebaseInstanceId