- 博客(23)
- 收藏
- 关注
原创 handlerThread
3)HandlerThread:封装了Handler + Thread,HandlerThread适合在有需要一个工作线程(非UI线程)+任务的等待队列的形式,优点是不会有堵塞,减少了对性能的消耗,缺点是不能同时进行多个任务的处理(因为就一个线程处理),需要等待进行处理。2)Thread:线程,可以看作是进程的一个实体,是CPU调度和分派的基本单位,他是比进程更小的独立运行的基本单位。1)Handler:在Android中负责发送和处理消息,通过它可以实现其他支线线程与主线程之间的消通讯。
2023-03-23 20:24:58 207
原创 idleHandler
在工作中还没有使用过IdleHandler,但源码中有一处地方用到了:在ActivityThread中通过IdleHandler来在空闲时调用GC,来减少卡顿的可能性。
2023-03-23 20:23:30 193
原创 threadlocal怎么保证唯一性
threadlocal实例存入的时候,用它的hashcode作为key,threadlocal本身作为value保存。其他线程都拿不到这样就保证了唯一性。线程中维护了一个threadlocals变量,实例是一个threadlocalMap(是一个hashtable实现的)threadlocal怎么保证唯一性。
2023-03-23 20:21:51 273
原创 looper对象解析
所以,建议在Looper.prepare()后,调用Looper.myLooper()来获取对此Looper的引用,一来是用于终止(quit()必须在对象上面调用);next()方法中去检查队列头是否有消息,有消息则比对执行时间与当前时间,时间还没到则调用nativePollOnce阻塞一段时间(队头消息的执行时间-当前时间)然后取出队头消息进行执行。handler最终会在哪个线程执行,取决于looper所在的线程,执行的方法则是发送的handler的dispatchmessage方法。
2023-03-23 20:21:03 196
原创 MessageQueue解析
3、不为空,然后判断msg是否到执行时间,到了就移除并返回消息,没有到就给nextPollTimeoutMillis=与现在时间的差。其实就是一个对象,指向下一个对象,循环下去形成一个链,只需要保存一个对象即可。2、判断新消息的时间是否在已有的消息中最小,是就插入到队首,并将next指向下一个消息,此新消息保存为队首消息,用于下一次比对。2、消息是否为空,为空代表队列中没有消息,给nextPollTimeoutMillis=-1,代表一直沉睡。方法会返回一个消息,交给looper执行。
2023-03-23 20:20:46 149
原创 handler是怎么做到切换线程的?(面试常问)
handler在主线程实例化,子线程拿到这个handler的引用,发送数据,生成数据的时候会把自己赋值给target,然后塞入队列,looper的loop方法最终会用这个target去处理数据。然后呢,比如子线程发送的,要去主线程执行。handler发送的消息在哪个线程处理,取决于绑定了哪个looper,这个looper在哪个线程,那么消息最终就在哪个线程处理。其实和主线程给成员变量赋值,子线程去取和处理,就形成了切换。looper的作用是让数据去到要去的线程,自动触发处理数据。
2023-03-23 20:18:07 906
原创 handler中的同步屏障机制解析
然后,looper的死循环中,会判断一个消息的target==null,满足条件就会开始dowhile遍历,直到找到异步消息并执行,执行完会重复上述操作。(异步消息判断方法由)setAsynchronous(),将某条消息设置为异步,不过我们平时发送需要通过反射才能调用到。还有一种就是handler构造里传参数,但这个是发送所有消息都是异步。同步屏障不能唤醒block的线程,也不会阻止消息的发送到队列。简单来说就是发送一个特殊的消息,它的target为空。当我们手动关闭同步屏障时,就不会卡住同步消息了。
2023-03-23 20:17:04 148
原创 handler原理解析
简单做法就是可执行代码是能一直执行下去的,死循环便能保证不会被退出,例如,binder线程也是采用死循环的方法,通过循环方式不同与Binder驱动进行读写操作,当然并非简单地死循环,无消息时会休眠。其实MessageQueue内部的消息是按需要发送的时间点从小到大排列的,后面会分析到,从当前if里的when判断也能看出一二,当队首的Message未到达发送的时间点时,说明其当前所有的消息都未到达发送的时间,上面说过,Handler发送消息并不是通过定时器发送的。线程如果阻塞了,需要唤醒线程。
2023-03-23 20:16:04 116
原创 adb shell input
例:手机端输出demo字符串,指令:adb shell input “demo”.例: 点击坐标(300,600),对应输入: input tap 300 600.键盘事件:input keyevent ,其中KEYCODE参考下文。例:点击返回键,相应指令: input keyevent 4.点击事件:input tap。122 移动光标到行首或列表顶部。123 移动光标到行末或列表底部。input(模拟用户输入)176 打开系统设置。220 降低屏幕亮度。221 提高屏幕亮度。231 打开语音助手。
2023-03-23 20:11:54 2719
原创 如何用java批量修改文件名和生成xml
首先在Android studio项目中创建module library,选择类型为java的。然后编写java脚本,也就是带main方法的java类,包含批量处理的逻辑。通过File api,传入文件路径,即可获得所有路径下的文件进行批量处理。然后点击main方法左边的绿色按钮即可运行。
2023-03-22 22:12:06 223
原创 adb shell monkey命令实战解析记录-命令与调试专栏
monkey命令是一个用于对应用程序进行压力测试的实用工具,该命令随机发送指定次数的用户事件流(按键输入、触屏、手势等)到 APP 界面。monkey 是猴子的单词,顾名思义就是在手机 APP 上蹿下跳不断地随意乱输入一通。语法格式:options 参数:-p <allowed_package> # 允许测试的软件包, 可以指定多个 -p 参数支持多个软件包-c <main_category> # 主分类, 可以指定多个 -c 参数。
2023-03-22 20:50:27 319
原创 adb shell wm 命令解析
wm窗口管理命令可以获取屏幕的 分辨率、像素密度 等信息,甚至可以临时修改屏幕的 分辨率、像素密度 等参数,可以很方便地查看 APP 在不同像分辨率和素密度手机/平板上的显示效果。查看帮助wm。
2023-03-21 21:30:53 1469
原创 adb shell pm 命令解析与运用
pm工具为包管理(package manager)的简称,可以使用pm工具来执行应用的安装和查询应用包的信息、系统权限、控制应用。pm list packages 列出设备中已经安装的所有应用包(包括系统应用和用户应用)get-install-location :返回当前的安装位置。set-install-location ‘location’:设置默认的安装位置。create-user ‘USER_NAME’ :增加一个新的USER;-g:授予应用程序清单中列出的所有权限(只有6.0系统可用);
2023-03-21 21:29:39 2009
原创 adbshell am命令全解
如果未指定,则终止所有用户的进程。请参阅 intent 参数的规范。–activity-clear-when-task-reset 添加 FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET 标记。–activity-exclude-from-recents 添加 FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS 标记。–activity-reset-task-if-needed 添加 FLAG_ACTIVITY_RESET_TASK_IF_NEEDED 标记。
2023-03-21 21:23:54 2260 1
原创 adb shell下常见查看命令
getprop ro.build.version.release # 获取设备的 Android 版本, 例如: 8.1.0。getprop ro.build.version.sdk # 获取设备的 SDK Version, 例如: 27。getprop ro.product.model # 获取设备的型号, 例如: BLA-AL00。getprop ro.product.brand # 获取设备的商标, 例如: HUAWEI。
2023-03-21 21:23:36 5154
原创 grep过滤命令
grep -rE “ActivityManager|WindowManager” temp/log.txt > output.text [过滤ActivityManager和WindowManager关键字的日志,并输出到当前目录output.text文件中]grep -rE “Child_” temp/log.txt [过滤电脑temp/log.txt文件中包含“Child_”关键字的日志并显示在终端]grep命令,用于过滤/搜索的特定字符: grep --help。用法: grep [选项]…
2023-03-21 21:14:58 933
原创 adb 获取日志命令-史上最全
adb logcat -s ActivityManager:I WindowManager:W [输出TAG为"ActivityManager"并且优先级大于等于"Info"和TAG为"WindowManager"并且优先级大于等于"Warn"的日志]adb logcat 获取的是日志buffer中从头到尾的日志,并且最新的日志会持续写入。-b 查看日志消息的缓冲区, 包括’main’,‘system’, ‘radio’, ‘events’, ‘crash’, ‘default’ or ‘all’
2023-03-21 21:11:15 10544
原创 adb 环境变量配置
我的电脑》高级》设置》环境变量》Path》增加G:\tools\adt-bundle\sdk\platform-tools。比如我的adb.exe路径G:\tools\adt-bundle\sdk\platform-tools\adb.exe。其实就是将adb.exe的路径放到Path中,目的是cmd直接可以使用adb命令。如果出现’adb’ is not recognized。如果出现一堆adb信息说明配置成功。打开cmd窗口,输入adb看效果。(注意不要adb.exe)
2023-03-21 21:11:08 626
原创 adb 常用命令
注:remount后的设备,可以直接安装apk,不受版本号限制,adb push out/NaviLauncher00/Launcher.apk system/app。adb get-serialno 获取设备的序列号,这个命令获取到的序列号就是利用“adb devices”命令获取的设备列表的序列号。2、adb shell 进入shell模式,这个模式下可以使用连接终端里的linux命令,linux命令和unix命令类似,稍有差异。adb get-product 获取设备的ID。
2023-03-21 21:07:27 2181
原创 2020-04-29
记录AIDL遇到的坑刚入项目组,下拉项目编译,同事都没事,偏偏我这里报了错。真是够倒霉!网上找了半天,各种方法都试过没能解决,浪费了两天时间。最后一个老员工建议,让我把项目代码放到D盘,不要放到桌面(C盘)然后问题就解决了!!!有经验就是好,我分析了下,原因有两种:C盘的文件写入要权限(studio拿不到权限写入不了)路径名称过长(报错为Failed toGetFullPathNam...
2020-04-29 23:23:11 118
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人