昨天我试着写我的内容提供商并测试它。不幸的是,这段代码:
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
方法,从而创建一个不确定的循环。