【问题标题】:OnLoadFinished called infinitelyOnLoadFinished 被无限调用
【发布时间】:2015-02-25 13:04:53
【问题描述】:

昨天我尝试编写我的内容提供程序并对其进行测试。不幸的是,这段代码:

if(loader.getId() == 1)       
 getContentResolver().insert(Uri.parse("content://com.example.djak.contentprovidertest.provider/cte"), values);

做某事,因此 onLoadFinished 被无限调用。有人知道发生了什么吗?当我删除它时 onLoadFinished 只被调用一次。 什么时候调用 onLoaderReset ?有人可以给我一个真实的例子来测试它吗? 提前致谢。

这是加载器的所有代码:

@Override
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
    loader = new CursorLoader(this, Uri.parse("content://com.example.djak.contentprovidertest.provider/cte"),
            null, null, null, null);


    Log.d("Some looong data", "Create");

    return loader;
}

@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor data) {

    ContentValues values = new ContentValues();
    values.put("user", "s");


    if(loader.getId() == 1) getContentResolver().insert(Uri.parse("content://com.example.djak.contentprovidertest.provider/cte"), values);

    Log.d("Some looong data", "Finish");


}


@Override
public void onLoaderReset(Loader<Cursor> loader) {
    Toast.makeText(this, "RESET", Toast.LENGTH_SHORT).show();
}

我设置了我的一个按钮的 onClickListener:

       findViewById(R.id.temp_button).setOnClickListener(new View.OnClickListener() {
       @Override
       public void onClick(View v) {
           getLoaderManager().initLoader(1, null, MainActivity.this);
       }
   });

我只是尝试一下,但我不知道为什么 onLoadFinished 会被无限次调用。

【问题讨论】:

  • 不完整的代码对你没有帮助
  • 好的,我添加加载器的所有代码。

标签: android android-contentprovider loader


【解决方案1】:

根据official documentation

加载器将监控数据的变化,并将其报告给 您在这里通过新电话。 (这里 = onLoadFinished 方法) 您不应该自己监控数据。 例如,如果数据是 Cursor 并且您将它放在 CursorAdapter,使用 CursorAdapter(android.content.Context, android.database.Cursor, int) 构造函数,没有传入任何一个 FLAG_AUTO_REQUERY 或 FLAG_REGISTER_CONTENT_OBSERVER(即使用 0 对于标志参数)。这可以防止 CursorAdapter 做 它自己对光标的观察,从那时起就不需要了 发生变化你会得到一个新的光标在这里抛出另一个调用。

话虽如此,当你打电话时

if(loader.getId() == 1) getContentResolver().insert(Uri.parse("content://com.example.djak.contentprovidertest.provider/cte"), values); 

onLoadFinished 内部,您再次触发onLoadFinished 方法,创建了一个无限循环。

【讨论】:

  • 非常感谢!这解释了会发生什么!在实际情况下何时调用 onLoaderReset ?实际上我对加载器很感兴趣,因为在我读到当你有后台线程时它们可以管理旋转屏幕情况(这与异步任务不方便)之前的某个地方,即加载器不会改变旧活动的视图,但你能解释一下吗那如何实现?我知道异步任务会导致内存泄漏或视图更改不再存在,但是加载程序如何解决这个问题???
  • @DPM 这是非常好的问题,解释它需要一些时间和精力。我建议你提出新的问题来解决这个问题。祝你好运,编码愉快:-)
  • 非常感谢!我很快就会这样做!
猜你喜欢
  • 2013-04-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-21
  • 1970-01-01
  • 2020-09-09
  • 2010-11-18
  • 1970-01-01
相关资源
最近更新 更多