Android中的消息机制主要指Handler的运行机制。Handler的使用过程很简单,通过它可以轻松地 将一个任务切换到Handler所在的线程中去执行 。Handler在日常开发中的最常用的作用是通过它更新UI。具体来说是这样的:有时候需要在子线程中进行耗时的IO操作,可能是读取文件或者访问网络等,当耗时操作完成以后可能需要在UI上做一些改变,由于Android开发规范的限制,我们并不能在子线程中访问UI控件,否则就会触发程序异常,这个时候通过Handler就可以将更新UI的操作切换到主线程中执行。因此,本质上来说,Handler并不是专门用于更新UI的,它只是常被开发者用来更新UI。
ThreadLocal是通过线程隔离的方式防止任务在共享资源上产生冲突, 线程本地存储是一种自动化机制,可以为使用相同变量的每个不同线程都创建不同的存储。 @pdai
带着BAT大厂的面试问题去理解
- 什么是ThreadLocal? 用来解决什么问题的?
- 说说你对ThreadLocal的理解
- ThreadLocal是如何实现线程隔离的?
- 为什么ThreadLocal会造成内存泄露? 如何解决
- 还有哪些使用ThreadLocal的应用场景?
前言
对于ThreadLocal
,大家的第一反应可能是很简单呀,线程的变量副本,每个线程隔离。那这里有几个问题大家可以思考一下:
ThreadLocal
的 key 是弱引用,那么在ThreadLocal.get()
的时候,发生GC之后,key 是否为null?ThreadLocal
中ThreadLocalMap
的数据结构?ThreadLocalMap
的Hash 算法?ThreadLocalMap
中Hash 冲突如何解决?ThreadLocalMap
的扩容机制?ThreadLocalMap
中过期 key 的清理机制?探测式清理和启发式清理流程?ThreadLocalMap.set()
方法实现原理?ThreadLocalMap.get()
方法实现原理?- 项目中
ThreadLocal
使用情况?遇到的坑? - ……
很多(我就直接代表很多人了🐶)做 Android 的同学认识和学习 ThreadLocal 都是通过 Looper 中的 sThreadLocal 这个静态变量开始的,然后就会进入一个误区:sThreadLocal 是 Looper 中的一个静态变量啊,当
Looper#prepare(boolean quitAllowed)
方法调用sThreadLocal.set(new Looper(quitAllowed))
的时候存到 ThreadLocalMap 中的 value (Looper) 的 key 值竟然是 this,也就是 sThreadLocal 这个静态变量?那一个静态变量怎么能作为 key值呢?静态变量在这个进程中可是独一份啊,其他线程的 Looper 再调用 Looper#prepare(boolean quitAllowed) 的时候岂不会把之前的 Looper 给替代了?
本节将介绍 View 的一个核心知识点:事件分发机制
。
事件分发机制不仅仅是核心知识点更是难点,不少初学者甚至中级开发者面对这个问题时都会觉得困惑。另外,View 的另一大难题滑动冲突
,它的解决方法的理论基础就是事件分发机制,因此掌握好 View 的事件分发机制是十分重要的。本节将深入介绍 View 的事件分发机制,在这一篇会对事件分发机制进行概括性地介绍,而在下一篇将结合系统源码去进一步分析事件分发机制。
一、点击事件的传递规则
在介绍点击事件的传递规则之前,首先我们要明白这里要分析的对象就是 MotionEvent
,即点击事件
,关于 MotionEvent 在之前已经进行了介绍。所谓点击事件的事件分发,其实就是对 MotionEvent 事件的分发过程,即当一个 MotionEvent 产生了以后,系统需要把这个事件传递给一个具体的 View,而这个传递的过程就是分发过程。点击事件的分发过程由三个很重要的方法来共同完成:dispatchTouchEvent
、onInterceptTouchEvent
和 onTouchEvent
,下面我们先介绍一下这几个方法。
背景
adb 命令执行过程在某些机型上总是卡住。
后来发现是 adb 版本的问题。
真机 Android 版本比较低,需要用老版本的 adb。
Version 28.0.2 没有问题,就重新下载并配置了旧版本的 platform-tools。
0. 卸载当前adb
如果使用 brew 下载的,也用 brew 卸载
brew uninstall android-platform-tools
用Canvas的draw***方法去绘制图像图形,绘制的坐标一般是从Canvas左上角开始计算的,如果想要把一个图像放到某个位置,直接drawBitmap传递图片左上角的坐标即可。
但是drawText不一样,如果你传递进去字符串,会发现文字的位置和你指定的不一样。
源码是native方法,没法直接看
Paint.getTextBounds:
当你通过这个方法来获取尺寸的时候,你可以得到能够包裹文字的最小矩形,就是图中红色边框的那部分,你可以得到一个Rect对象,包含这个最小尺寸的几个值。
背景
使用adb Uninstall卸载app的时候出现了Failure [DELETE_FAILED_INTERNAL_ERROR]
的提示,卸载失败!
解决方法:
可以通过删除安装包的方式对应用进行卸载:
步骤如下
- 通过命令
adb shell pm list packages -s
列出的应用包列表,从中找到要删除的包名 - 获取此要卸载的包名的地址
adb shell pm path com.xx.xx
- 挂载系统读写权限
adb remount
- 删除包
adb shell rm /system/app/xxxxxx/xxxxxx.apk
- 最后
adb reboot
重启
MTK MT8167版本刷机工具打不开,提示缺少libpng12-0
这玩意应该是ubuntu16+之后就废弃了,我用的ubuntu22.04,装不上
看了国外的一个问答,发现可以通过自己编译来解决,膜拜大神
参考博文
解决方法
sudo apt install build-essential zlib1g-dev
mkdir src
cd src
wget https://ppa.launchpadcontent.net/linuxuprising/libpng12/ubuntu/pool/main/libp/libpng/libpng_1.2.54.orig.tar.xz
tar Jxfv libpng_1.2.54.orig.tar.xz
cd libpng-1.2.54
./configure
make
sudo make install
sudo ln -s /usr/local/lib/libpng12.so.0.54.0 /usr/lib/libpng12.so
sudo ln -s /usr/local/lib/libpng12.so.0.54.0 /usr/lib/libpng12.so.0
一、背景
问题:
工作中主力机用MacBook,平常有些工具需要用Ubuntu(比如MTK装机软件)。
MacBook切换到Ubuntu主机的时候每次都需要将显示器从MacBook连接到Ubuntu主机上,比较麻烦。
解决方法:
Ubuntu每次开机都发送ip地址到指定邮箱,然后在MacBook上用vnc通过ip远程连接Ubuntu(Ubuntu主机接了个HDMI欺骗器,这样远程连接的时候才能显示桌面)
二、脚本及开机自动执行
1. 安装ifconfig
获取ip地址用到ifconfig
这个命令,先在终端试一下有没有安装,没装的话先执行下面命令安装: