抬头仰望星空,是否能发现自己的渺小。

伪斜杠青年

人们总是混淆了欲望和理想

2021.02 第一周目 踩坑小记

kotlin.synchronized lazy implement 内存泄漏问题

by lazy { ... }中传递的lambda表达式可能会捕获它的闭包中使用的上下文的引用,引用会一直被持有直到变量被初始化。

而目前项目中经常这样用:

val dialog by lazy{
  SomeDialog(context)
}
class SomeDialog(conetxt){
    val dialog=Dialog().apply{
       // xxx 
    }

    fun show(){
      dialog.setContentView(view)
      dialog.show()
    }
}

这样子包装起来的话,泄露起来非常容易,dismiss 了,dialog 依旧没有被释放。解决泄露的方法就是 不要长期持有 dialog 对象,需要时再创建。或者把 val 改成 var,dismiss 时置空,show 时创建。

在 ConstraintLayout 中使用 include 标签无效的问题

是我大意了,因为 include 不设置layout_widthlayout_height也不会报错,于是导致了约束未能生效。

Dialog 适配键盘的升起与落下

主要靠计算以及自己做动画。相关计算参考:

http://blog.cgsdream.org/2015/11/22/dialog-height-when-softkeyboard-state-change/

当然这个计算也有人做了:KeyboardStatusDetector.java

回传相关值自己做 animation 即可。

BitmapFactory.Options中的inDensity,inTargetDensity,inScreenDensity

这个直接看公式即可,压不压呢,怎么压呢,都需要慢慢调:

bitmap的宽=原图片的宽 / inSampleSize * (inTargetDensity / inDensity+0.5f)
bitmap的高=原图片的高 / inSampleSize * (inTargetDensity / inDensity+0.5f)
bitmap所占内存的大小=bitmap的宽*bitmap的高*每个像素所占内存

参考:https://www.jianshu.com/p/7ede587be4bc

JNI C++ 中传递自定义的对象数组

这个比较麻烦,但是规律并不复杂:

定义一个和 java 层结构一样的结构体,再使用 env -> NewObject 去创建一个 java 对象,再逐个用 env 提供的方法赋值。

可以网上找找 demo,比较麻烦的应该是数组,不过网上也有,一维二维三维都行。

JNI 中 long long 的意思

不怎么写 C++ , 突然看到这个 long long 返回值有点不理解,后来发现是一个加强版的 long 的意思,还有 long long int。

在C++11中,标准要求long long 整型可以在不同平台上有不同的长度,但至少有64位。

参考:https://www.cnblogs.com/DswCnblog/p/5667942.html

其他

发现一个做view 背景的Material组件 ShapeableImageView,有点酷,参考:

Android Notes|玩转 ShapeableImageView

此外还有一个官方的 运用弹簧物理学原理为图形运动添加动画 很多时候官方的这个应该都可以满足需求,我记得以前,我是一点点调的动画,太惨了。


0条评论

发表评论