Flutter网络请求的一些异常错误
HandshakeExceptionIOS: HandshakeException: Handshake error in client (OS Error:CERTIFICATE_VERIFY_FAILED: application verification failure(handshake.cc:359))
服务端Https证书过期或者错误。有时候某些免费的证书不行!
SocketExceptionSocketException:Failed host lookup : xxx.com’ (OS Error: nodenme nor servname prowded,or not known,errno = 8)
用户网络问题 看看代码是否声明了网络权限、或者用户是否关闭了网络权限
SocketException:Failed host lookup : xxx.com’ (OS Error: nodenme nor servname prowded,or not known,errno = 7)
可能是用户开启VPN
Flutter之Element
上一篇简单的看了下Widget的源码,发现Widget主要作用就是createElement()。
贴出来Element系列的类关系图。
ElementElement构造及主要变量123456789101112131415161718192021222324252627282930313233abstract class Element extends DiagnosticableTree implements BuildContext { Element(Widget widget) : assert(widget != null), _widget = widget; Element? _parent; ///Element中持有Widget,且是通过构造方法入参Widget。 Widget _widget; bool _dirty = true; ///BuildOwner可以先粗看作是构建管理者, //维护了 List<Element> _dirtyElements和Map<GlobalKey, Element& ...
Flutter之Widget
WidgetWidget是我们在Flutter中接触到的最多的类。
从逻辑上来说,Widget的关系图可以分为以下几个部分。(当然Flutter中并没有组合型组件这么一个Class)
1234567891011121314151617///Describes the configuration for an [Element].///描述 [Element] 的配置文件@immutableabstract class Widget extends DiagnosticableTree { const Widget({ this.key }); final Key? key; ... @protected Element createElement(); ... static bool canUpdate(Widget oldWidget, Widget newWidget) { return oldWidget.runtimeType == newWidget.runtimeType && old ...
JVM内存模型
根据《Java虚拟机规范》JVM内存模型可以分为以下几个部分:
堆Heap、虚拟机栈VM Stack、方法区Method Area、本地方法栈Native Method Area、程序计数器Program Counter Register
下面用一段代码示例及图解展示
12345678910111213141516public class Math { public Math() { } public int compute() { int a = 1; int b = 2; int c = (a + b) * 10; return c; } public static void main(String[] args) { Math math = new Math(); math.compute(); }}
1234567891011121314151617181920212223242 ...
对象在内存中的存储布局
对象在内存中的存储布局可以分为3个部分:Header、Instance Data、Padding
Header(对象头)对象头由以下几部分组成:Mark Word、Klass Pointer 、数组指针
Mark Word
8b
存储对象的HashCode 分代年龄 锁标志位信息 线程持有的锁 偏向id 偏向时间戳等
HotSpot 虚拟机对象头Mark Word
存储内容
标志位
状态
对象hashcode 分代年龄
01
无锁
偏向线程id 偏向时间戳
01
偏向锁
指向锁记录的指针
00
轻量级锁定
指向重量级锁的指针
10
重量级锁定
空不需要记录
11
gc标记
KlassPoint 4b
数组长度 4b(只有数组对象才有)
Instance Data(实例数据)对象里的各种字段内容
Padding (对齐填充)HotSpot要求对象总长度是8字节的整数倍 ,如果Head+Instance Data不是8字节的整数倍,会通过Padding来补全
对象的大小和指针压缩123456对象的大小可以引入jol包查看&l ...
Java类加载机制
Java类加载过程主要分为三个部分:
loading → linking(verification → preparation → resolution) → initializing
Loading主要通过ClassLoader将资源(.class文件等)载入JVM,是一个懒加载,只有在使用到的时候才进行加载
loading过程如下图所示
Android的常用ClassLoader 待补充(最好再补充一下插件化的知识)
java中的类加载器
BootStrapClassLoader:引导类加载器
ExtClassLoader:扩展类加载器
AppClassLoader:应用程序类加载器
ClassLoader源码ClassLoader加载类的代码主要是loadClass方法中实现了双亲委派机制
1234567891011121314151617181920212223242526272829303132333435363738394041ClassLoader.javaprotected Class<?> loadClass(String name, boole ...
Java线程池
1234567891011121314151617181920ExecutorService cachedThreadPool = Executors.newCachedThreadPool();ExecutorService singleThreadExecutor = Executors.newSingleThreadExecutor();ExecutorService fixedThreadPool = Executors.newFixedThreadPool(10);//corePoolSize –核心线程数 //maximumPoolSize –线程池线程最大数量//keepAliveTime – 空闲线程存活时间 //unit – keepAliveTime的单位//workQueue – 队列//threadFactory – executor创建线程的工厂//handler – 拒绝策略public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize ...
Java线程
Thread启动方式
new Thread().start()
new Thread(new Runnable()).start()
new Thread(new FutureTask(Callable callable)).start()
Executors.newCacheThreadPool().execute(Runnable r)
Thread的停止stop 不能使用
等待run()执行结束
intercept() + Thread.currentThread().isIntercept();
在run内部调用Thread.sleep 在抛出异常 、捕获之前 会清除中断标记
控制线程的执行顺序join
singleThread线程池
Thread状态及切换New、Runnable(Ready、Running)、Blocked、Timed_Waiting、Terminated
Thread关键词 yield joinsleep 休眠 时间到后 转为ready状态,获取执行的资格
wait 等待 需要notify 才能转为ready状态,获取执行的资格
Glide缓存
Glide的缓存包含内存缓存 和磁盘缓存
内存缓存内存缓存部分可以细分为活动缓存ActiveResources和内存缓存MemoryCache
活动缓存:使用了弱引用方式,针对正在使用的图片,不使用的图片即释放回内存缓存
内存缓存:使用了lru
读取部分12345678910111213141516171819202122232425262728基于glide4.11.0版本Engine#loadFromMemory() private EngineResource<?> loadFromMemory( EngineKey key, boolean isMemoryCacheable, long startTime) { if (!isMemoryCacheable) { return null; } ///1.从活动缓存中获取图片 EngineResource<?> active = loadFromActiveResources(key); if (active != null) ...
Flutter性能分析
1.如何进行分析
性能分析指标
2.如何优化
1Thank you for your suggestion. I'm doing it now, but it will take some time to do it completely