昨天我试着写我的内容提供商并测试它。不幸的是,这段代码:

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();
}

我设置了一个按钮的点击监听器:
       findViewById(R.id.temp_button).setOnClickListener(new View.OnClickListener() {
       @Override
       public void onClick(View v) {
           getLoaderManager().initLoader(1, null, MainActivity.this);
       }
   });

我只是尝试一下,我不知道为什么onloadfinished被称为无限次。

最佳答案

根据official documentation
加载程序将监视数据的更改,并将其报告给
你接到了新的电话。(这里是onloadfinished方法)您不应该自己监视数据。
例如,如果数据是一个游标,并且您将它放在
cursoradapter,使用cursoradapter(android.content.context,
android.database.cursor,int)构造函数,不传入
flag_auto_requery或flag_register_content_observer(即,使用0
对于flags参数)。这样可以防止cursoradapter执行
它自己观察光标,这是不需要的,因为
如果发生更改,您将得到一个新的光标,并在此处引发另一个调用。
当你打电话的时候

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

onLoadFinished中,您将再次触发onLoadFinished方法,从而创建一个不确定的循环。

10-08 06:46