TakWolf-Deprecated / CNode-Material-Design

CNode 社区第三方 Android 客户端,原生 App,Material Design 风格,支持夜间模式。
https://cnodejs.org
Apache License 2.0
1.34k stars 347 forks source link

关于"渲染兼容模式" #34

Closed TakWolf closed 8 years ago

TakWolf commented 8 years ago

从提交 https://github.com/TakWolf/CNode-Material-Design/commit/05664b818df6ae0b96cf82fbdf4cd274f33bdf40 开始,新增加了一个"渲染兼容模式",在设置中可以选择启用或者关闭这个功能。

screenshot_2016-05-14-09-22-20

TakWolf commented 8 years ago

作用

这个功能主要尝试解决来自 https://github.com/TakWolf/CNode-Material-Design/issues/26 的问题,即解决Markdown在原生客户端上的渲染实现以及效率问题。

默认的情况下,话题详情页面使用原生组件ListView生产数据列表,ListView中的每一个Cell都包含一个WebView来渲染各自数据源中的MarkdownContent。Cell有一个回收池重用机制,会造成WebView不断重载,性能抖动严重。

启用兼容模式后,话题详情页面使用一个WebView来统一渲染,即所有数据统一由Dom渲染,没有回收重用机制,也就么有原生渲染的诸多问题。这种方式性能瓶颈主要在WebView本身的性能问题上。同时丢失了原生组件上的一些UI动画过度效果。

TakWolf commented 8 years ago

兼容性

原生WebView的渲染性能问题,在Android 5.0以上版本,表现还可以,在以下版本,性能问题严重。 因此这个设置,在API 21以上(Android 5.0),默认是关闭的,在API 20以下,默认是开启的。

兼容模式实际最低版本为API 14,但是项目最低兼容版本为 API 9,也就是说,如果你是Android 2.X的系统,即使开启了这个设置,实际上也不会启用兼容模式。

TakWolf commented 8 years ago

实现

兼容布局的实现可以参考 https://github.com/TakWolf/CNodeMD-Page-Render-Compat ,这个实现实际上并不是一个纯粹的面向web的方案,在客户端中,他只实现布局系统,网络数据的获取仍然通过原生代码实现。

客户端采用MVP结构,因此重用了大量的业务逻辑代码,兼容模式的实现实际上只是提供了一种V的实现方式而已。详情可以参考对比 TopicActivity.javaTopicCompatActivity.java 的编码实现。

目前项目已经很难再算作是纯正的原生项目了,已经演变成了混合开发的模式了,混合部分的代码在总量中已经占有了重要的比重。个人觉得这个项目是混合开发的一个不错的参考示例。