位置: 编程技术 - 正文

Android Cursor源码笔记(2)(android源码分析实录)

编辑:rootadmin

推荐整理分享Android Cursor源码笔记(2)(android源码分析实录),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:android源码怎么运行,android实例源码,android looper源码,android handler源码,androidstudio源码网,android 源代码,android源码分析实录,android源码分析实录,内容如对您有帮助,希望把文章链接给更多的朋友!

CrossProcessCursor**extends Cursor,按照注释所说,这是Cursor的一个扩展,支持Cursor被远端进程所使用(某种意义上,跨进程Cursor才是被用的最多的,因此这里也成了一个base的接口),一个跨进程的Cursor可以通过fill(fillWindow) 一个 CursorWindow(**A buffer containing multiple cursor rows)的方式编排到远端进程,一个优化是该Cursor本身可以提供一个pre-filled的window(getWindow),从而避免了一次数据拷贝.

getWindow():返回一个已经将Cursor执行的row的data填充完毕的CursorWindow.window中所含有的row就是Cursor的getPosition()所标识的row(就是Cursor当前所指向的row),Window中的data会和Cursor当前所指保持同步(Cursor move, window也会move)

Android Cursor源码笔记(2)(android源码分析实录)

fillWindow(int position, CursorWindow window),从position开始(包含position),直到最后或者Window的空间耗尽,所有的row的data填充到Window.

onMove(int oldPosition, int newPosition),每次Cursor成功的Move到新的位置都会被回调, onMove返回false会导致Move也返回false,并且Cursor的位置会变为beforeFirst(-1),一般来说,这个函数应该只在Cursor自己的Move类函数中调用,不能在外部调用.

AbstractCursor implements CrossProcessCursor, 所有具体Cursor类的基类,封装了一部分默认 常规操作。

扩展了ContentObserver -> SelfContentObserver,内部维护一个AbstractCursor的weakRef(构造时会指定Cursor),onChange(boolean selfChange)回调函数会尝试继续传递change给Cursor的onChange函数,而该Observer则是在setNotificationUri(ContentResolver cr, Uri notifyUri, int userHandle)时就会自己new一个并注册(mContentResolver.registerContentObserver(mNotifyUri, true, mSelfObserver, userHandle)).setNotificationUri(ContentResolver cr, Uri notifyUri, int userHandle)函数会被多线程调用,因此内部会加锁,并且每次只能register一个SelfContentObserver(旧的会被刷掉),相应的getNotificationUri()内部也会加锁.setExtras(Bundle extras)/getExtras(),内部有一个专门的mExtras对应。checkPosition(),如果是无效位置(哨兵位)的话会抛异常.finalize(),最后一次力所能及的释放资源:注销observer,以及close(没有close的话),之所以是力所能及,是因为JVM并不保证一定调用(常识).onChange(boolean selfChange),因为涉及到了mSelfObserver的操作,会加锁,SelfContentObserver触发的onChange的selfChange为false.mContentObservable会保存当前所有的ContentObserver,在这一步也会通过自己的dispatchChange(selfChange, null)将change通知到注册到自己的Observer(mContentObservable说白了就是把Listener机制封装到了一个单独的类中,没什么神秘的,mDataSetObservable同样如此),如果是selfChange而且mNotifyUri不是null,那么会调用mContentResolver.notifyChange(mNotifyUri, mSelfObserver).getColumnIndex(String columnName),简单的遍历ColumnName数组进行不区分大小写匹配.final moveToPosition(int position),内部维护了一个mPos来表示Cursor当前指向的位置,构造时初始化为-1,注意该函数是final的,在mPos就是当前要移动的pos时,直接return true,接着是一个onMove函数的回调(这为subclass提供了自己的定制回调),如果onMove返回的是false,那么mPos也直接置为-1,返回的也是false,这就解释了前面onMove函数注释的意义(对MoveXXX操作有决定权),如果onMosve是true,那么mPos设置为position,代表着Move的成功,函数也返回true.其他的moveXXX()函数其实就是该函数的简单包装.isFirst()/isLast()/isBeforeFirst()/isAfterLast(),mPos和getCount()的简单逻辑比较,注意的是在count为0时, isBeforeFirst() == isAfterLast() == true.fillWindow(int position, CursorWindow window)是s对DatabaseUtils.cursorFillWindow()的直接转发.一个mClosed Flag,在这个抽象基类中(AbstractCursor), close()的操作只是设置Flag,清空Observable,触发Deactivate/Close的callback.没有实质性的操作,这也是抽象类所必须的,close的具体行为应该由subClass自己决定。requery()/onDeactivateOrClose()会触发mDataSetObservable的notifyChanged()/notifyInvalidated(),还会注册/注销SelfObserver.一个是开始前的初始化,一个是结束时的清理.

Volley 源码解析 原文连接,转载请注明作者和原文连接(@woaitqswoaitqs.github.io)为什么需要阅读Volley的源码Volley是Google在年推出的一个网络库,用于解决复杂网络环境下网

android图文列表 privateHandlergetJsonHandler=newHandler(){publicvoidhandleMessage(android.os.Messagemsg){StringjsonData=(String)msg.obj;System.out.println(jsonData);try{JSONArrayjsonArray=newJSONArray(jsonData);Log.i

[置顶] Android自定义动画类——实现3D旋转动画 Android中的补间动画分为下面几种:(1)AlphaAnimation:透明度改变的动画。(2)ScaleAnimation:大小缩放的动画。(3)TranslateAnimation:位移变化的动画。(4)Ro

标签: android源码分析实录

本文链接地址:https://www.jiuchutong.com/biancheng/374438.html 转载请保留说明!

上一篇:Android开发中MVP模式浅析(Android开发中遇到的问题及解决方案)

下一篇:关于Android的上下文“Context”(基于android的app)

  • 应交税费负数调整到其他流动资产
  • 财务负责人如何解绑
  • 提前买礼物
  • 什么是存货周转率?存货周转率的意义是什么
  • 银行代发工资必须交社保吗
  • 7月薪资8月发怎么交税
  • 展位费怎么入账
  • 金融商品转让为什么不能扣除相关税费
  • 发票上是17%的税率吗
  • 处置可供出售金融资产取得的投资收益
  • 小企业销售商品因批量原因给予客户的商业折扣
  • 银行承兑汇票贴现率多少
  • 员工劳动保险赔多少钱
  • 银行付款退汇怎么做账
  • 应付债券利息调整科目理解
  • 金碟系统操作
  • 补记以前年度收入在报表中怎么处理
  • 金税盘用途
  • 开票资料上的电话可以是手机吗?
  • 个人所得税退税截止日期2023
  • 印花税的购销合同改成买卖合同了吗?
  • 增值税发票自查报告
  • 应付账款是贵公司欠还是欠贵公司
  • windows 10如何清除联网记录
  • 特殊工种人身安全保险费可以扣除吗
  • searchnavversion.exe - searchnavversion是什么进程 作用是什么
  • php ftell
  • 购买股票的会计分录
  • 无人蹭网 网络还不好
  • php使用方法
  • 小型企业的资产负债表
  • 卡特迈国家公园地图
  • 展开双翅的绯红之花
  • thinkphp3.1
  • vue 百度地图 移动端
  • vue引用svg矢量图
  • vue叠化在哪里
  • 想学web前端
  • 固定资产到期日
  • 记账凭证的主要作用有
  • 会务费什么企业可以开
  • 什么时候进项税转出
  • 材料采购与原材料账户核算内容有何差别
  • 收到以前年度增值税退税账务处理怎么做账
  • 什么是电子承诺
  • 工程项目怎么挣钱
  • 控股公司的收入怎么计算
  • 业务招待费专票可以抵扣吗
  • 租厂房需要办环评注意事项
  • 专票已认证但又不能抵扣
  • 股权转让如何计算股权原值
  • 农产品加计扣除1%账务处理
  • 营业利润为负数表示什么
  • 上年记错账了,本年如何调整
  • 事业单位公务员考试条件
  • 公司折价购买的股票
  • 软件开发费属于研发和技术服务还是信息技术服务
  • 免征增值税还要计提附加税吗
  • 应付账款和应付票据的区别与联系
  • macossierra安装发生错误
  • Windows 2003作中转VPN服务器多路由共享上网的方法
  • centos 安装教程
  • 如何使用光盘做启动盘
  • windows7问题解决方案
  • win1020h2正式版
  • linux编译安装php扩展
  • docker 开源项目
  • dos命令 获取文件名
  • js excel解析
  • ip安全策略设置报错
  • if条件程序
  • jquery编写Tab选项卡滚动导航切换特效
  • javascript高级教程pdf
  • 印花税没有按时申报怎么办
  • 四川国家税务局官网
  • 资源税属于国税还是地税
  • 可以抵扣的消费税有哪些
  • 豫事办登录时密码叫重置什么原因
  • 长安cs752016款2.0手动
  • 两会热点有哪些呀?
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设