qingmei2
qingmei2
交流能够让每个人都集思广益,因此如果有意见或者建议,欢迎大家评论
@chengfangpeng 你好,leanback这个库(或者说AndroidTV的开发)我不是很熟,但是分页的话,可以使用别的库,没必要非要用`Paging`进行分页哈。
@erehmi 多谢指教 😄
@NickJian 内存中维护一个`memory repository layer`感觉可行,但本质和`Room`的`persistent layer`似乎没什么区别? 我没有做过这样的尝试,因为不舍得放弃`Room`原生的支持,请问你这种方案有相关的demo源码吗,我有空拜读一下。 😄
@waitwalker 如果Android项目本身的`app`(而不是`flutter-module/.android/app`)中的build.gradle文件中没有配置`productFlavors`, 不需要在对应的 `flutter-module/.android/app` 中配置相同的`productFlavors` 如果你的项目是Android原生和Flutter混编,应该找Android开发的同事(或者看Android原生项目的源码),看一下`build.gradle`中的配置,保证对应的buildTypes配置和`flutter-module/.android/app/build.gradle`一致即可。
# 反思|Android 输入系统 & ANR机制的设计与实现 ## 四、ANR机制的设计与实现 对 **输入系统** 有了更初步整体的认知之后,接下来本文将针对`ANR`机制进行更深一步的探索。 通常来讲,`ANR`的来源分为`Service、Broadcast、Provider`以及`Input`两种。 这样区分的原因是,首先,前者发生在 **应用进程** 组件中的`ANR`问题通常是相对好解决的,若`ANR`本身容易复现,开发者通常仅需要确定组件的代码中是否在 **主线程中做了耗时处理**;而后者`ANR`发生的原因为 **输入事件** 分发超时,包括按键和屏幕的触摸事件,通过阅读上一章节,读者知道 **输入系统** 中负责处理`ANR`问题的是处于 **系统进程** 中的`InputDispatcher`,其整个流程相比前者而言逻辑更加复杂。 简单理解了之后,读者需要知道,「组件类`ANR`发生原因通常是由于 **主线程中做了耗时处理**」这种说法实际上是笼统的,更准确的讲,其本质的原因是 **组件任务调度超时**,而在设备资源紧凑的情况下,`ANR`的发生更多是综合性的原因。 而`Input`类型的`ANR`相对于`Service、Broadcast、Provider`,其内部的机制又截然不同。 ### 1、第一类原理概述 具体不同在哪里呢,对于`Service、Broadcast、Provider`组件类的`ANR`而言,[Gityuan](http://gityuan.com/) 在 [这篇文章](http://gityuan.com/2019/04/06/android-anr/)...
## 三、工作流程原理概述 `Paging`幕后是如何工作的? 接下来,笔者将针对`Paging`分页组件的工作流程进行系统性的描述,探讨`Paging`是 **如何实现异步分页数据的加载和响应** 的。 为了便于理解,笔者将整个流程拆分为三个步骤,并为每个步骤绘制对应的一张流程图,这三个步骤分别是: * 1.初次创建流程 * 2.UI渲染和分页加载流程 * 3.刷新数据源流程 ### 1.初次创建流程  如图所示,我们定义了`ViewModel`和`Repository`,`Repository`内部实现了`App`的数据加载的逻辑,而其左侧的`ViewModel`则负责与`UI`组件的通信。 `Repository`负责为`ViewModel`中的`LiveData`进行创建,因此,开发者需要创建对应的`PagedList.Config`分页配置对象和`DataSource.Factory`数据源的工厂,并通过调用`LivePagedListBuilder`相关的`API`创建出一个`LiveData`。 当`LiveData`一旦被订阅,`Paging`将会尝试创建一个`PagedList`,同时,数据源的工厂`DataSource.Factory`也会创建一个`DataSource`,并交给`PagedList`持有该`DataSource`。 这时候`PagedList`已经被成功的创建了,但是此时的`PagedList`内部只持有了一个`DataSource`,却并没有持有任何数据,这意味着观察者角色的`UI`层即将接收到一个空数据的`PagedList`。 这没有任何意义,因此我们更希望`PagedList`第一次传递到`UI`层级的同时,已经持有了初始的列表数据(即`InitialLoadSizeHint`);因此,`Paging`尝试在后台线程中通过`DataSource`对`PagedList`内部的数据列表进行初始化。 现在,`PagedList`第一次创建完毕,并持有属于自己的`DataSource`和初始的列表数据,通过`LiveData`这个管道,即将向`UI`层迈出属于自己的第一个脚印。 ### 2.UI渲染和分页加载流程  通过内部线程的切换,`PagedList`从后台线程切换到了`UI`线程,通过`LiveData`抵达了`UI`层级,也就是我们通常说的`Activity`或者`Fragment`中。 读者应该有印象,在上文的示例代码中,`Activity`观察到`PagedList`后,会通过`PagedListAdapter.submitList()`函数将`PagedList`进行注入。`PagedListAdapter`第一次接收到`PagedList`后,就会对`UI`进行渲染。 当用户尝试对屏幕中的列表进行滚动时,我们接收到了需要加载更多数据的信号,这时,`PagedList`在内部主动触发数据的加载,数据源提供了更多的数据,`PagedList`接收到之后将会主动触发`RecyclerView`的更新,用户通过`RecyclerView`原生动画观察到了更多的列表`Item`。 ### 3.刷新数据源流程...
@kristijandraca your suggestion is pretty useful,thanks!
目前对长图的加载支持还不够完善,看看之后有没有好的方式能够支持更多格式的图片
@smartzheng 这个情况我追踪一下 👌