Android OnLoadFinished被无限调用

Android OnLoadFinished被无限调用,android,android-contentprovider,loader,Android,Android Contentprovider,Loader,昨天,我尝试编写我的内容提供者并对其进行测试。不幸的是,这段代码: if(loader.getId() == 1) getContentResolver().insert(Uri.parse("content://com.example.djak.contentprovidertest.provider/cte"), values); 做某事,因为onLoadFinished被称为无限。有人知道发生了什么事吗?当我删除它时,onLoadFinished只调用一次。 何时调用on

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

if(loader.getId() == 1)       
 getContentResolver().insert(Uri.parse("content://com.example.djak.contentprovidertest.provider/cte"), values);
做某事,因为onLoadFinished被称为无限。有人知道发生了什么事吗?当我删除它时,onLoadFinished只调用一次。 何时调用onLoaderReset?有人能给我一个真实的例子来测试它吗? 提前谢谢

Thas是加载程序的所有代码:

@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();
}
我只是尝试了一下,我不知道为什么onLoadFinished被称为无限次。

根据

加载程序将监视数据的更改,并将其报告给 您可以通过这里的新电话。(here=onLoadFinished方法)您不应该自己监控数据。 例如,如果数据是光标,而您将其放置在 CursorAdapter,使用CursorAdapter(android.content.Context, android.database.Cursor,int)构造函数,而不传入 标记\自动\重新查询或标记\寄存器\内容\观察者(即,使用0 对于flags参数)。这将防止游标适配器执行以下操作: 它自己观察光标,这是不需要的,因为 如果发生变化,您将得到一个新的光标,并在此处抛出另一个调用

话虽如此,当你打电话的时候

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

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

不完整的代码对您没有帮助好的,我为加载程序添加了所有代码。非常感谢!这就解释了发生了什么!在实际情况下何时调用onLoaderReset?实际上,我对加载器很感兴趣,因为在我读到之前的某个地方,当你有后台线程(这与异步任务不一致)时,加载器可以管理旋转屏幕的情况,即加载器不会改变旧活动的视图,但你能解释一下如何实现吗?我知道异步任务可能会导致内存泄漏或视图更改,但这已经不存在了,但加载程序如何证明这一点?@DPM这是一个非常好的问题,解释它需要一些时间和精力。我建议你提出新的问题来解决这个问题。祝你好运,快乐编码:-)非常感谢!我很快就会做到的!
if(loader.getId() == 1) getContentResolver().insert(Uri.parse("content://com.example.djak.contentprovidertest.provider/cte"), values);