昨天我尝试编写我的内容提供商并进行测试。不幸的是,这段代码:
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();
}
我设置了一个按钮的onClickListener:
findViewById(R.id.temp_button).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
getLoaderManager().initLoader(1, null, MainActivity.this);
}
});
我只是尝试了,我不知道为什么onLoadFinished被无限次调用。
答案 0 :(得分:2)
Loader将监控数据的更改,并将其报告给 你通过这里的新电话。 (此处= onLoadFinished方法)您不应自行监控数据。 例如,如果数据是Cursor,则将其放在a中 CursorAdapter,使用CursorAdapter(android.content.Context, android.database.Cursor,int)构造函数,没有传入任何一个 FLAG_AUTO_REQUERY或FLAG_REGISTER_CONTENT_OBSERVER(即使用0 对于flags参数)。这可以防止CursorAdapter执行操作 它自己观察Cursor,这是一个不需要的 改变发生你会得到一个新的Cursor在这里抛出另一个调用。
话虽如此,当你打电话时
if(loader.getId() == 1) getContentResolver().insert(Uri.parse("content://com.example.djak.contentprovidertest.provider/cte"), values);
在onLoadFinished
内,您再次触发onLoadFinished
方法,创建无限循环。