文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Android onLoadFinished与onLoaderReset回调详解及实例

2022-06-06 01:24

关注

Android onLoadFinished与onLoaderReset回调详解及实例

onLoadFinished

这个方法是在前面已创建的加载器已经完成其加载过程后被调用,这个方法保证会在应用到加载器上的数据被释放之前被调用。在此方法中,你必须删除所有对旧数据的使用(因为它将很快会被删除),但是不要自己去释放它们,因为它们的加载器会做这些事情。

加载器一旦了解到应用不再使用数据时,将马上释放这些数据。例如,如果数据是一个从CursorLoader来的游标,你不应调用游标的close(),如果游标被放置在一个CursorAdapter中,你应使用swapCursor()方法,以使旧的游标不被关闭。例如:


//这个Adapter被用于显示列表的数据. 
SimpleCursorAdapter mAdapter; 
... 
public void onLoadFinished(Loader<Cursor> loader, Cursor data) { 
  // Swap the new cursor in. (The framework will take care of closing the 
  // old cursor once we return.) 
  mAdapter.swapCursor(data); 
} 

onLoaderReset

当一个已创建的加载器被重置从而使其数据无效时,此方法被调用。此回调使你能发现什么时候数据将被释放于是你可以释放对它的引用。

下面这个实现调用参数为null的swapCursor():


// 这个Adapter被用于显示列表的数据
SimpleCursorAdapter mAdapter;
... 
public void onLoaderReset(Loader<Cursor> loader) { 
  //此处是用于上面的onLoadFinished()的游标将被关闭时执行,我们需确保我们不再使用它
  mAdapter.swapCursor(null); 
}

例子

作为一个例子,这里完整实现了一个Fragment显示一个包含从联系人contentprovider 返回查询数据的ListView的内容的功能,它使用一个CursorLoader来管理对provider的查询。


public static class CursorLoaderListFragment extends ListFragment 
    implements OnQueryTextListener, LoaderManager.LoaderCallbacks<Cursor> { 
  // 这是用于显示列表数据的Adapter 
  SimpleCursorAdapter mAdapter; 
  // 如果非null,这是当前的搜索过虑器 
  String mCurFilter; 
  @Override public void onActivityCreated(Bundle savedInstanceState) { 
    super.onActivityCreated(savedInstanceState); 
    // 如果列表中没有数据,就给控件一些文字去显示.在一个真正的应用 
    // 中这应用资源中取得. 
    setEmptyText("No phone numbers"); 
    // 我们在动作栏中有一个菜单项. 
    setHasOptionsMenu(true); 
    // 创建一个空的adapter,我们将用它显示加载后的数据 
    mAdapter = new SimpleCursorAdapter(getActivity(), 
        android.R.layout.simple_list_item_2, null, 
        new String[] { Contacts.DISPLAY_NAME, Contacts.CONTACT_STATUS }, 
        new int[] { android.R.id.text1, android.R.id.text2 }, 0); 
    setListAdapter(mAdapter); 
    // 准备loader.可能是重连到一个已存在的或开始一个新的 
    getLoaderManager().initLoader(0, null, this); 
  } 
  @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { 
    // 放置一个动作栏项用于搜索. 
    MenuItem item = menu.add("Search"); 
    item.setIcon(android.R.drawable.ic_menu_search); 
    item.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM); 
    SearchView sv = new SearchView(getActivity()); 
    sv.setOnQueryTextListener(this); 
    item.setActionView(sv); 
  } 
  public boolean onQueryTextChange(String newText) { 
    // 在动作栏上的搜索字串改变时被调用.更新 
    //搜索过滤器,并重启loader来执行一个新的查询 
    mCurFilter = !TextUtils.isEmpty(newText) ? newText : null; 
    getLoaderManager().restartLoader(0, null, this); 
    return true; 
  } 
  @Override public boolean onQueryTextSubmit(String query) { 
    // 我们不关心这个方法 
    return true; 
  } 
  @Override public void onListItemClick(ListView l, View v, int position, long id) { 
    // 写入你想写的代码 
    Log.i("FragmentComplexList", "Item clicked: " + id); 
  } 
  // 这是我们想获取的联系人中一行的数据. 
  static final String[] CONTACTS_SUMMARY_PROJECTION = new String[] { 
    Contacts._ID, 
    Contacts.DISPLAY_NAME, 
    Contacts.CONTACT_STATUS, 
    Contacts.CONTACT_PRESENCE, 
    Contacts.PHOTO_ID, 
    Contacts.LOOKUP_KEY, 
  }; 
  public Loader<Cursor> onCreateLoader(int id, Bundle args) { 
    // 当一个新的loader需被创建时调用.本例仅有一个Loader, 
    //所以我们不需关心ID.首先设置base URI,URI指向的是联系人 
    Uri baseUri; 
    if (mCurFilter != null) { 
      baseUri = Uri.withAppendedPath(Contacts.CONTENT_FILTER_URI, 
          Uri.encode(mCurFilter)); 
    } else { 
      baseUri = Contacts.CONTENT_URI; 
    } 
    // 现在创建并返回一个CursorLoader,它将负责创建一个 
    // Cursor用于显示数据 
    String select = "((" + Contacts.DISPLAY_NAME + " NOTNULL) AND (" 
        + Contacts.HAS_PHONE_NUMBER + "=1) AND (" 
        + Contacts.DISPLAY_NAME + " != '' ))"; 
    return new CursorLoader(getActivity(), baseUri, 
        CONTACTS_SUMMARY_PROJECTION, select, null, 
        Contacts.DISPLAY_NAME + " COLLATE LOCALIZED ASC"); 
  } 
  public void onLoadFinished(Loader<Cursor> loader, Cursor data) { 
    // 将新的cursor换进来.(框架将在我们返回时关心一下旧cursor的关闭) 
    mAdapter.swapCursor(data); 
  } 
  public void onLoaderReset(Loader<Cursor> loader) { 
    //在最后一个Cursor准备进入上面的onLoadFinished()之前. 
    // Cursor要被关闭了,我们需要确保不再使用它. 
    mAdapter.swapCursor(null); 
  } 
} 

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!


阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     801人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     348人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     311人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     432人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     220人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-移动开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯