Loader:onLoadFinished只调用一次

 mobiledu2502896655 发布于 2023-02-10 09:18

我在一个活动中使用了一个加载器.我能够启动加载器并调用onLoadFinished.当我更新数据并onContentChanged在加载器中调用时,我看到loadInBackground并且deliverResult都被调用.这是小道似乎停止的地方.我没有收到任何回调onLoadFinished.

如果我重新创建活动(也就是方向更改或重新启动),那么它将以相同的方式运行.

我正在使用support-v4加载器和加载器管理器.

SharedPreferenceLoader基于CommonsWare的加载器:

public class SharedPreferencesLoader extends AsyncTaskLoader
        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 {
    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 .

撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有