二叉树

1 | //Definition for a binary tree node. |
其实有两种思路
1.通过组合组件实现
1 | import 'package:flutter/material.dart'; |
2 参考CheckBox,将绘制方形代码部分改成圆角
1 | CheckBox.class |
可以看到方形边框的绘制是通过_outerRectAt()方法实现的,那么把圆角增大,是不是可以达到圆形边框的效果.
所以我把CheckBox的源码拷贝下来了,把圆角改成了宽度的一半,即可实现圆形边框的CheckBox.修改的代码如下
1 | ///修改前 |
Java中有四种引用,强引用、软引用、弱引用、虚引用。
强引用不会被回收
1 | Object obj = new Object(); |
1 | String str1 = new String("softReferenceTest1"); |
1 | softReferenceTest1 |
可以看到str2并没有被回收。
当内存充足的时候,软引用对象不会被JVM回收,而当内存不足时,软引用对象会被回收掉。
Android的SoftReferences代码注释里写了,要避免使用SoftReferences进行缓存
在实践中,软引用在缓存场景中效率低下。运行时(Runtime)缺乏足够的信息来决定应该清除哪些引用、保留哪些引用。最致命的是,当面临“清除软引用”和“扩展堆内存”之间的选择时,运行时无法做出合理决策。
由于缺乏对每个引用在应用中的价值评估,软引用的实用性大打折扣:
引用过早被清除会导致重复计算(不必要的性能开销)。
引用过晚被清除则会浪费内存(可能导致内存压力或OOM崩溃)。
推荐替代方案:LruCache
1 | String str1 = new String("weakReferenceTest1"); |
1 | weakReferenceTest1 |
str1没有被回收,str2被回收了。当没有强引用指向weakReference,一gc就会被回收。Android中经常使用WeakReference来规避内存泄漏的风险。
1 | ReferenceQueue<String> queue = new ReferenceQueue<>(); |
1 | null |
phantomReference.get()永远返回null。
虚引用很少使用,且虚引用只有一个构造方法,必须配合ReferenceQueue一起使用。
1 | ReferenceQueue<String> referenceQueue = new ReferenceQueue<>(); |
1 | weakReference=java.lang.ref.WeakReference@566776ad |
可以看到当gc之后weakReference.get()已经为null,但是在referenceQueue.poll()却有值,并且为WeakReference@566776ad,和weakReference相等。也就是 gc之后会将weakReference添加进WeakReference关联的ReferenceQueue。 可以用来监听某个对象是否被回收,android中的LeakCanary
框架就是利用这个原理进行分析是否有内存泄漏。
上一篇博客 Flutter实战之一起写个WanAndroid客户端 简单介绍了一下Flutter版本WanAndroid项目,这一篇主要记录项目中碰到的一些问题,避免大家在这些坑中再花太多的时间。
github地址 目前已经有54个star,喜欢的话可以给个星鼓励一下