【Android】技术调研:用代码模拟屏幕点击、触摸事件

在Android中,有些场景需要使用代码来模拟人的操作,比如微信自动抢红包、UI测试等都需要模拟实现点击事件(Click)、触摸事件(Touch)、键盘事件(KeyBoard)等。那么,有没有现成的方案可以实现呢?答案当然是肯定的啦,往下看。

经过调研发现,给系统模拟注入输入事件有如下几种方式:

一、使用shell命令

使用android自带的adb shell,里面自带一个input工具,使用方法如下:

1
2
3
adb shell #进入系统
input keyevent KEYCODE_BACK #模拟按返回键
input keyevent KEYCODE_HOME #模拟按Home键

【MySQL】查询保持IN中的顺序

select * from table_name where id in ()的时候,MySQL会自动按主键自增排序,要是按IN中给定的顺序来取,如何实现呢?

比如下面这个查询结果,mysql会默认使用主键id的ASC自增排序结果集:

【Linux】执行shell脚本出现异常:bad interpreter- No such file or directory如何解决

在Linux中执行.sh脚本,异常/bin/bash^M: bad interpreter: No such file or directory.

一、分析

这是不同系统编码格式引起的:在windows系统中编辑的.sh文件可能有不可见字符,所以在Linux系统下执行会报以上异常信息。

二、解决

1)在windows下转换:
利用一些编辑器如UltraEdit或EditPlus等工具先将脚本编码转换,再放到Linux中执行。转换方式如下(UltraEdit):File–>Conversions–>DOS->UNIX即可。

”二分查找“算法的时间复杂度

算法的时间复杂度无非就是for、while等包含起来的基本运算单元的循环次数

1、二分查找

二分查找(binary search),也称作折半查找(half-interval search),每次划分一半进行下一步搜索,所以时间复杂度无非就是while循环的次数!

【Android】Picasso加载本地图片如何清理缓存cache?

使用Picasso加载SD卡图片的时候,Picasso也会对该图片进行缓存。所以如果该图片即使已经变了,Picasso在加载时会仍然使用缓存,而不更新图片。

1、Picasso缓存策略

我们都知道图片缓存使用的是Map键值对存储的,这里的Key就是加载的图片的Url,所以如果我们使用相同的ImageUrl去加载图片的话,如果使用了缓存,Picasso会直接读取缓存的内容,而不是从SD卡、或者网络Http中重新加载。

2、Picasso如何跳过缓存

试了很多网上推荐的方法均不见起效,最后使用了下面这种策略,也就是加载图片时直接跳过缓存

1
Picasso.with(getContext()).load(imageUrl).memoryPolicy(MemoryPolicy.NO_CACHE).into(image);

注意其中的.memoryPolicy(MemoryPolicy.NO_CACHE)即是关键代码,其中

  • MemoryPolicy.NO_CACHE:是指图片加载时放弃在内存缓存中查找。
  • MemoryPolicy.NO_STORE:是指图片加载完不缓存在内存中。

ps:此处的方法并不是真正的清理缓存,而是跳过缓存直接从源头获取

网上有几种错误的方法如下,经验证均不起效:

1、Picasso.with(getActivity()).invalidate(file);
2、Picasso.with(getActivity()).load(url).skipMemoryCache().into(image);

最后还是在StackOverFlow的Clear Cache memory of Picasso查到了如上的解决办法。

如何生成100个1-100以内的不重复的随机数

这是个经典的面试题目:生成长度为100的数组,插入1-100以内的但均不重复的随机数

一、简单实现思路:

(1) 把N个数放入Hashtable 或者arrayList 中.

(2) 从上面的集合中随机抽取一个数放入int数组中.

(3) 把取出的这个数从上面的集合中删除.

(4) 循环 (2),(3) 步骤,直到int数组取满为止.

【Android】如何查看Activity Task栈的情况

我们都知道,每个Activity都有taskAffinity属性,这个属性指出了它希望进入的Task。

如果一个Activity没有显式的指明该 Activity的taskAffinity,那么它的这个属性就等于Application指明的taskAffinity,如果 Application也没有指明,那么该taskAffinity的值就等于包名。而Task也有自己的affinity属性,它的值等于它的根 Activity的taskAffinity的值。

一、查看task栈情况

在cmd命令行里或者Android Studio中的Terminal里敲入如下命令:

1
adb shell dumpsys activity

然后会出现很长一段详细信息,滚到中间的地方,会看到Task栈的状态如下:

Java中的封装、继承与多态

这次我们来了解一下面向对象的三大基石封装,继承、多态,然后大致对比一下继承和多态的区别。

一、封装:

  封装是实现面向对象程序设计的第一步,封装就是将数据或函数等集合在一个个的单元中(我们称之为类)。被封装的对象通常被称为抽象数据类型。

封装的意义:
  封装的意义在于保护或者防止代码(数据)被我们无意中破坏。在面向对象程序设计中数据被看作是一个中心的元素并且和使用它的函数结合的很密切,从而保护它不被其它的函数意外的修改。封装提供了一个有效的途径来保护数据不被意外的破坏。相比我们将数据(用域来实现)在程序中定义为公用的(public)我们将它们(fields)定义为私有的(privat)在很多方面会更好。

Java访问权限修饰符的区别

  Java有四种访问权限,其中三种有访问权限修饰符,分别为private,public和protected,还有一种不带任何修饰符:

  1. private: Java语言中对访问权限限制的最窄的修饰符,一般称之为“私有的”。被其修饰的类、属性以及方法只能被该类的对象访问,其子类不能访问,更不能允许跨包访问。
  2. default:即不加任何访问修饰符,通常称为“默认访问模式“。该模式下,只允许在同一个包中进行访问。
  3. protect: 介于public 和 private 之间的一种访问修饰符,一般称之为“保护形”。被其修饰的类、属性以及方法只能被类本身的方法及子类访问,即使子类在不同的包中也可以访问。
  4. public: Java语言中访问限制最宽的修饰符,一般称之为“公共的”。被其修饰的类、属性以及方法不仅可以跨类访问,而且允许跨包(package)访问。

Powered by Hexo and Hexo-theme-hiker

Copyright © 2013 - 2019 iTimeTraveler All Rights Reserved.

访客数 : | 访问量 :