OnLoadFinished无限调用

时间:2015-02-25 13:04:53

标签: android android-contentprovider loader

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

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被无限次调用。

1 个答案:

答案 0 :(得分:2)

根据official documentation

  

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方法,创建无限循环。