网站标签怎么做跳转,如何制作公众号模板,wordpress范例,做任务什么网站Android做到现在。开始感觉到Android确实还是太年轻。系统本身好不够成熟#xff0c;相关文档更是少的可怜。在Android的旅途中到处是暗坑陷阱#xff0c;掉进去摔得半死#xff0c;还只能靠自己琢磨着爬出来。想 在大部分工作集中在了定义一套ContentProvider以及上层的显示… Android做到现在。开始感觉到Android确实还是太年轻。系统本身好不够成熟相关文档更是少的可怜。在Android的旅途中到处是暗坑陷阱掉进去摔得半死还只能靠自己琢磨着爬出来。想 在大部分工作集中在了定义一套ContentProvider以及上层的显示控件上。一个ContentProvider向外提供的接口十分有限但就是 这几个东西你要表征出正确标准就是和系统ContentProvider一致的行为的语义还是很费功夫的。至少我就摔了好几个跟头。为了降低后续部 队的伤亡我努力搬走几个绊脚石、填掉几个坑希望能有一些作用。ContentProvider中最重要的就是query操作。query根 据输入返回一个符合条件的Cursor。这就可能出现以下几种情况1. 查询成功包含几个正确的结果2. 查询失败没有符合的结果3. 输入错误 触发了某个异常4. 没能查询到结果但无法确定是输入错误还是查询失败。第一种情况是我们最需要的当然是需要正确维系的而最后一种情况在大部分应用中应该不会出现但在 我的应用中会的*_#而第二种第三种是比较常见的。经过我的测试系统的ContentProvider维持这样的语义如果是情况2返回 正常的Cursor并且其count为0相当于empty cursor如果是情况3不抛出任何异常返回null的Cursor。这样的话明明白白写出来是很好理解的但由于没有官方的文档说明在自定义的 时候经常会误用。比如在某些情况下用null表征查询失败用抛出异常来描述错误的输入。返回empty cursor如果是通过databasecursor自然会有db帮你维护但是如果返回ArrayListCursorMergeCursor或其 他自定义的Cursor就需要自己维系了。ArrayListCursor可以通过new ArrayListCursor(Columns, new ArrayList(){})来提供。其中Columns一定不为null。MergeCursor不能以new MergeCursor(new Cursor[]{})来创建而需要通过new MergeCursor(new Cursor[]{aEmptyCursor, ...}来维系其实很好理解我呆了...。自定义的Cursor也一定要提供生成empty cursor的方式。如果将ContentProvider作为一个单独的module来理解不通过异常而是通过null来返回MS是有好处 的。在module的出口吃掉所有异常虽然不能提供足够的信息异常信息全部写入日志但可能会使上层使用更简单。但在Android中我并没有感 觉到这一点。作为ContentProvider的上层函数ListActivity.managedQuery、 ListView.setListAdapter等根本不能处理一个null的Cursor在ListView中这会触发一个异常。更无语的是当你 把一个null Cursor设置为manage的后。它不会立即抛异常而是在OnFreeze等生命周期函数的时候因无法处理null Cursor而抛出一个异常。这使得你根本无法在当地catch该异常换句话ListActivity的manageCursor根本是个无法使用的函数。你必须用getContext().query()获得Cursor然后判定该Cursor是否null在进行startManagingCursor进行绑定。这远不如直接用异常进行错误路径的处理来的统一和方便。当然有些东西我们是不能改变的只能去适应。对于自定义的cursor, ContentProvider最重要的是在无人造错误输入的情况下返回empty cursor而不是null。至于使用null响应还是异常响应上我个人觉得还是和系统同步为好虽然别扭但至少统一不容易有歧义。此外ContentProvider还有很多细致的语义。比如返回的Cursor需要绑定一个URI以便自动响应更新。自定义的更新需要支持deleteRow等操作语义等等。总之我们需要更好的文档或更多经验文档以便我们更好的爬上巨人的肩膀。PS而上层的ListView更是陷阱重重。首先绑定到ListView的Cursor必须有_id项否则会有异常抛出。如果做过.net的开发 这一点是可以想到的但是这种问题应该在文档中写明。另外在ListView中如果你不绑定一个数据源你一定不能在layout中添加涉及内容的 属性。比如android:heightwrap_content这会在onMeasure的时候抛出异常。 转载于:https://blog.51cto.com/duguguiyu/362200