Scroller是怎么实现View的弹性滑动?
在MotionEvent.ACTION_UP事件触发时调用startScroll()方法,该方法并没有进行实际的滑动操作,而是记录滑动相关量(滑动距离、滑动时间)
接着调用invalidate/postInvalidate()方法,请求View重绘,导致View.draw方法被执行
当View重绘后会在draw方法中调用computeScroll方法,而computeScroll又会去向Scroller获取当前的scrollX和scrollY;然后通过scrollTo方法实现滑动;接着又调用postInvalidate方法来进行第二次重绘,和之前流程一样,如此反复导致View不断进行小幅度的滑动,而多次的小幅度滑动就组成了弹性滑动,直到整个滑动过成结束。
mScroller = new Scroller(context);
@Override
public boolean onTouchEvent(MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_UP:
// 滚动开始时X的坐标,滚动开始时Y的坐标,横向滚动的距离,纵向滚动的距离
mScroller.startScroll(getScrollX(), 0, dx, 0);
invalidate();
break;
}
return super.onTouchEvent(event);
}
@Override
public void computeScroll() {
// 重写computeScroll()方法,并在其内部完成平滑滚动的逻辑
if (mScroller.computeScrollOffset()) {
scrollTo(mScroller.getCurrX(), mScroller.getCurrY());
invalidate();
}
}
SharedPreference的commit ,apply区别,SharedPreference是线程安全的吗?
- apply没有返回值而commit返回boolean表明修改是否提交成功。
- apply是将修改数据原子提交到内存, 而后异步真正提交到硬件磁盘, 而commit是同步的提交到硬件磁盘,因此,在多个并发的提交commit的时候,他们会等待正在处理的commit保存到磁盘后在操作,从而降低了效率。而apply只是原子的提交到内容,后面有调用apply的函数的将会直接覆盖前面的内存数据,这样从一定程度上提高了很多效率。
代码中可以看到读写操作时都有大量的synchronized,因此它是线程安全的。
Android硬件加速原理
软件绘制与硬件加入对比:
如果硬件加速不支持或者被关闭,则使用软件绘制,生成的Canvas即Canvas.class的对象;
如果支持硬件加速,则生成的是DisplayListCanvas.class的对象;
两者的isHardwareAccelerated()方法返回的值分别为false、true,View根据这个值判断是否使用硬件加速。
线上native crash收集实现方案
上图给出NativeCrash收集的整体实现方案。APP中接入提供的SDK,包含一个通用SO和一个JAR,当APP中发生NDK崩溃时,会在手机端生成一个dmp文件,待下次APP重启后,将此dmp文件上传至服务端,在服务端进行解析、分类、聚合、可读展示等过程。
如果项目接入了Bugly,也就可以收集到NativeCrash上传至Bugly。
手机号一键免密登陆怎么做
三大运营商支持了手机号一键登录功能,需要实现一键登录需要接入各运营商的一键登录SDK,在集成官网创建应用。
mainfest中配置LargeHeap,真的能分配到大内存吗?能增加多大内存?
设置android:largeHeap="true"属性之后,进行如下测试查看最大可用内存,发现最大可用内存真的增大了。但是最大不能超过系统能分配给App的最大内存。
ActivityManager.getLargeMemoryClass() //可以获得开启largeHeap最大的内存大小
Bitmap Drawable View 三者之间的联系和区别
bitmap: 仅仅就是一个位图 你可以理解为一张图片在内存中的映射。 就这么简单。这个很多人都知道
view: 这个就是android的核心了,你看到的一切东西都是view 这个很多人也知道。 但是这个理解成都还不够,view最大的作用是2个 一个是draw 也就是canvas的draw方法,还有一个作用 就是测量大小。 要想明白这点。
drawable: 他其实本身和bitmap没有关系, 你可以把他理解为是一个绘制工具,和view的第一个作用是一摸一样的,你能用view的canvas 画出来的东西 你用drawable 一样可以画出来, 不一样的是drawable 仅仅能绘制,但是不能测量自己的大小,但是view可以。换句话说 drawable 承担了view的一半作用。
抓包的原理
要实现对App的网络数据抓包,需要监控App与服务器交互之间的网络节点,监控其中任意一个网络节点(网卡),获取所有经过网卡中的数据,对这些数据按照网络协议进行解析,这就是抓包的基本原理。
但是中间网络节点,不受我们控制,所以基本无法实现抓包的,只能在客户端和服务端进行抓包。
本地网络指的是WIFI的路由,如果直接抓路由器的包还是比较麻烦的,因此我们会在手机和本地路由之间加一层代理服务,这个代理服务由抓包工具去做,手机通过代理服务器的本地Ip地址和端口连上,手机将请求发送给代理服务器,代理服务器去请求手机发出的请求,然后返回给手机客户端。如果代理服务器退出,手机仍然是代理状态,找不到代理服务器,那么就请求不了数据,此时就得先退出代理状态了。