[Android]异步 layout inflation(翻译)
异步 layout inflation
原文:https://medium.com/@lupajz/asynchronous-layout-inflation-7cbca2653bf#.q22vpezg4
随着最近发布的Android Support Library, revision 24,Google开发者在v4包中增加了一个用来异步inflate layouts的帮助类。
进入 AsyncLayoutInflater
你会发现AsyncLayoutInflater可以使用在当你想要去懒加载你应用中部分UI或者用户行为的响应。这个帮助类将会允许你的UI线程在执行繁重的inflate时继续保持响应。
使用AsyncLayoutInflater你需要在你应用的UI线程创建一个它的实例。
假设下面部分代码是你Activity代码中的一部分(我将在这里使用Kotlin语法):
1 | val inflater = AsyncLayoutInflater(this) |
然后现在可以通过这个实例inflate你的layout文件:
1 | inflater.inflate(resId: Int, parent: ViewGroup) |
如你所见,inflate函数接收3个参数。第一个是你layout资源,第二个是可选的view作为预期inflated层次结构的parent,然后第三个是一个OnInflateFinishedListener
,是一个回调,一旦layout被inflate完毕它就会被回调(例子中被lambda函数代替)。
比较基本的LayoutInflater的inflate函数,一般使用一个boolean作为第三个参数,它表示是否inflate层次结构应该附属岛一个root参数上面。在我们的inflate函数的异步版本中并没有这样一个参数,大多数情况下你会使用这种方式调用:
1 | inflater.inflate(resId: Int, parent: ViewGroup) |
使用AsyncLayoutInflater的缺点
当然它有如下一些缺点:
parent的
generateLayoutParams()
函数必须是线程安全的。所有正在构建的views一定不能创建任何
Handlers
或者调用Looper.myLooper
函数。不支持设置
LayoutInflater.Factory
也不支持LayoutInflater.Factory2
不支持包含Fragments的inflating layouts
如果我们尝试异步的方式去inflate的layout不支持这种方式,那么inflation处理将会自动回退到主线程中。
使用Kotlin Android Extensions 的 Kotlin的小例子
MainActivity
1 | class MainActivity : AppCompatActivity() { |
activity_main.xml
1 | <?xml version="1.0" encoding="utf-8"?> |
async.xml
1 | <?xml version="1.0" encoding="utf-8"?> |
本文链接:https://blog.wangjiegulu.com/2016/09/01/Android-异步-layout-inflation(翻译)/
版权声明:本博客所有文章除特别声明外,均采用 CC BY 4.0 CN协议 许可协议。转载请注明出处。