auto.js循环遍历时出现点击失效

Auto.js 循环执行问题及解决策略
博客探讨了Auto.js在循环时遇到的点击事件仅触发一次的问题,指出可能原因是Android系统为节省电量而限制后台线程活跃度。解决方案包括使用press事件替代click,清除通知栏消息,避免循环中调用其他函数。充电状态可避免此问题。

最近突然发现auto.js循环时,只有第一次循环会触发点击事件,然后就没反应了,切换app就又可以执行

通过添加日志发现在第二次循环时,sleep之后代码不走了

 

经过百度,没有找到确定的原因

但是通过以下方法可以避免:

1.将click事件修改为press事件,例如 click(200,1000) 修改为 press(200,1000,50),press第三个参数是按压时间,单位毫秒

2.将通知栏中的消息全部删除(该条似乎是主要方案,确保运行过程中不会有新的通知,可以把通知全关掉)

3.循环体中不要调用其他函数,直接写逻辑代码

 

经多次查找和测试,在手机充电状态下不会出现,原因为:这是Android系统的限制,在未通电时为了省电会降低线程的活跃度,尤其是软件切换到后台时、手机进入休眠时更严重

参考: https://www.autojs.org/topic/3323/%E5%BD%93%E5%89%8D%E6%89%80%E6%9C%89%E7%89%88%E6%9C%ACsleep%E9%83%BD%E5%AD%98%E5%9C%A8%E7%9A%84%E5%A4%A7bug

在 JavaScript 中,`Map` 是一种用于存储键值对的数据结构,支持在历过程中删除元素。与 `map()` 历数组不同,`Map` 的历是通过迭代器实现的,因此需要特别注意迭代器的状态和引用的有效性,以避免出现错误。 ### 使用 `for...of` 历并安全删除元素 在 `Map` 中,可以使用 `for...of` 历键值对,并结合 `Map.prototype.delete()` 方法删除符合条件的元素。由于 `Map` 的历器不会因删除操作而失效,因此可以直接调用 `delete()` 方法进行删除操作。 ```javascript let myMap = new Map(); myMap.set(1, 'a'); myMap.set(2, 'b'); myMap.set(3, 'c'); for (let [key, value] of myMap) { if (value === 'b') { myMap.delete(key); // 安全删除符合条件的键值对 } } ``` 这种方式不会影响当前的历过程,因为 `Map` 的迭代器在历过程中会保持一致性,即使删除了当前项,也不会导致后续项的访问出现问题[^1]。 ### 使用 `Map.prototype.forEach` 历并删除元素 `Map` 还提供了 `forEach` 方法,允许对每个键值对执行指定的操作。在 `forEach` 回调中,可以通过 `Map.prototype.delete()` 方法删除当前键值对。 ```javascript let myMap = new Map(); myMap.set(1, 'a'); myMap.set(2, 'b'); myMap.set(3, 'c'); myMap.forEach((value, key, map) => { if (value === 'b') { map.delete(key); // 通过回调参数访问 map 并删除元素 } }); ``` `forEach` 方法的回调函数接收三个参数:当前的值、当前的键和当前的 `Map` 对象。通过第三个参数可以直接调用 `delete()` 方法删除当前项[^2]。 ### 使用 `Map` 历器手动控制删除 如果需要更细粒度地控制历过程,可以使用 `Map` 的 `entries()` 方法获取一个迭代器,并通过 `while` 循环手动历和删除元素。 ```javascript let myMap = new Map(); myMap.set(1, 'a'); myMap.set(2, 'b'); myMap.set(3, 'c'); let iterator = myMap.entries(); let result = iterator.next(); while (!result.done) { let [key, value] = result.value; if (value === 'b') { myMap.delete(key); // 手动控制删除操作 } result = iterator.next(); } ``` 通过手动管理迭代器,可以更灵活地处理复杂的历逻辑,同时确保删除操作不会影响后续的历[^1]。 ### 注意事项 在历 `Map` 并删除元素时,需要注意以下几点: - `Map` 的迭代器在历过程中不会因删除操作而失效,因此可以安全地删除当前项。 - 如果在历过程中需要多次删除元素,建议使用 `Map.prototype.forEach` 或手动控制迭代器的方式,以确保逻辑清晰。 - 删除操作不会影响当前的历顺序,但会影响后续的历结果。 ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值