高清大图加载该怎么处理?
如果是高清大图,那就说明不允许进行图片压缩,比如微博长图,清明上河图。
所以我们就要对图片进行局部显示,这就用到BitmapRegionDecoder属性,主要用于显示图片的某一块矩形区域。实际项目使用中,我们可以根据手势滑动,然后不断更新我们的Rect参数来实现具体的功能即可。
fun setImagePart() {
val inputStream: InputStream = assets.open("test.jpg")
val bitmapRegionDecoder: BitmapRegionDecoder =
BitmapRegionDecoder.newInstance(inputStream, false)
val options = BitmapFactory.Options()
val bitmap = bitmapRegionDecoder.decodeRegion(
Rect(0, 0, 100, 100), options)
image.setImageBitmap(bitmap)
}
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();
}
}
Binder在在Android中的应用
Binder在Android中的应用除了ServiceManager,你还想到了什么呢?
系统服务是用过getSystemService获取的服务,内部也就是通过ServiceManager。例如四大组件的启动调度等工作,就是通过Binder机制传递给ActivityManagerService,再反馈给Zygote。而我们自己平时应用中获取服务也是通过getSystemService(getApplication().WINDOW_SERVICE)代码获取。
AIDL(Android Interface definition language)。例如我们定义一个IServer.aidl文件,aidl工具会自动生成一个IServer.java的java接口类(包含Stub,Proxy等内部类)。
前台进程通过bindService绑定后台服务进程时,onServiceConnected(ComponentName name, IBinder service)传回IBinder对象,并且可以通过IServer.Stub.asInterface(service)获取IServer的内部类Proxy的对象,其实现了IServer接口。
synchronized和volatile区别
1.volatile本质是告诉JVM当前变量在寄存器中的值是不确定的,需要从主存中读取,synchronized则是锁定当前变量,只有当前线程可以访问该变量,其他线程被阻塞住。
2.volatile仅能用在变量级别,而synchronized可以使用在变量、方法、类级别。
3.volatile仅能实现变量的修改可见性,不能保证原子性;而synchronized则可以保证变量的修改可见性和原子性。
4.volatile不会造成线程阻塞,synchronized可能会造成线程阻塞。
5.volatile标记的变量不会被编译器优化,synchronized标记的变量可以被编译器优化。
volatile不能保证原子性的原因:线程A修改了变量还没结束时,线程B可以看到已修改的值,而且可以修改这个变量,而不用等A结束,是因为volatile变量没上锁。
SharedPreference的commit ,apply区别,SharedPreference是线程安全的吗?
- apply没有返回值而commit返回boolean表明修改是否提交成功。
- apply是将修改数据原子提交到内存, 而后异步真正提交到硬件磁盘, 而commit是同步的提交到硬件磁盘,因此,在多个并发的提交commit的时候,他们会等待正在处理的commit保存到磁盘后在操作,从而降低了效率。而apply只是原子的提交到内容,后面有调用apply的函数的将会直接覆盖前面的内存数据,这样从一定程度上提高了很多效率。
代码中可以看到读写操作时都有大量的synchronized,因此它是线程安全的。
android签名打包v1和v2有什么区别?
v1签名是对jar进行签名,V2签名是对整个apk签名:官方介绍就是:v2签名是在整个APK文件的二进制内容上计算和验证的,v1是在归档文件中解压缩文件内容。
两种签名所产生的结果:
v1:在v1中只对未压缩的文件内容进行了验证,所以在APK签名之后可以进行很多修改——文件可以移动,甚至可以重新压缩。即可以对签名后的文件在进行处理
v2:v2签名验证了归档中的所有字节,而不是单独的ZIP条目,如果您在构建过程中有任何定制任务,包括篡改或处理APK文件,请确保禁用它们,否则您可能会使v2签名失效,从而使您的APKs与Android 7.0和以上版本不兼容。
描述LayoutInflate的整个过程
使用代码:
LayoutInflater layoutInflater = LayoutInflater.from(this);
View buttonLayout = layoutInflater.inflate(R.layout.layutid, null);
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,在集成官网创建应用。
内存抖动实际怎么解决
产生的原因是在代码中频繁、循环地创建对象,导致大量对象频繁创建和销毁。普通的会因为内存使用越来越多导致卡顿。严重的,会产生大量不连续的内存空间,如果此时有一个大对象需要申请内存,就有可能申请失败,导致OOM内存溢出。
进入AS的Profiler工具,进入Memory指标,如果发现内存状态为起起伏伏的锯齿状走势,可以认为是内存抖动发生。
点击Record进行记录
一段时间后,stopRecord,这张表格代表的是,你Record这段时间之内创建的对象,点击一下第二列Allocations,对创建的数量进行排序,找出创建次数最多的对象去解决,减去不必要的对象创建。
mainfest中配置LargeHeap,真的能分配到大内存吗?能增加多大内存?
设置android:largeHeap="true"属性之后,进行如下测试查看最大可用内存,发现最大可用内存真的增大了。但是最大不能超过系统能分配给App的最大内存。
ActivityManager.getLargeMemoryClass() //可以获得开启largeHeap最大的内存大小
ReentrantLock和synchronized区别
(1) synchronized 是Java的一个内置关键字,而ReentrantLock是Java的一个类。
(2) synchronized只能是非公平锁。而ReentrantLock可以实现公平锁和非公平锁两种。
(3) synchronized不能中断一个等待锁的线程,而Lock可以中断一个试图获取锁的线程。
(4) synchronized不能设置超时,而Lock可以设置超时。
(5) synchronized会自动释放锁,而ReentrantLock不会自动释放锁,必须手动释放,否则可能会导致死锁。
Bitmap Drawable View 三者之间的联系和区别
bitmap: 仅仅就是一个位图 你可以理解为一张图片在内存中的映射。 就这么简单。这个很多人都知道
view: 这个就是android的核心了,你看到的一切东西都是view 这个很多人也知道。 但是这个理解成都还不够,view最大的作用是2个 一个是draw 也就是canvas的draw方法,还有一个作用 就是测量大小。 要想明白这点。
drawable: 他其实本身和bitmap没有关系, 你可以把他理解为是一个绘制工具,和view的第一个作用是一摸一样的,你能用view的canvas 画出来的东西 你用drawable 一样可以画出来, 不一样的是drawable 仅仅能绘制,但是不能测量自己的大小,但是view可以。换句话说 drawable 承担了view的一半作用。
WebView秒开的一些优化可以怎么做
首先我们要知道不能秒开的原因有哪些?
1.文件下载耗时:包括html、css、js、图片等
2.页面渲染耗时:页面渲染,解析js、css文件等
3.WebView创建耗时:首次创建WebView耗时大约需要500ms左右,第二次创建耗时大约需要20ms左右
今日头条针对自己平台的文章详情页做了很多优化,具体包括以下几点:
内置文章详情页所需的css、js等文件,并可以控制版本
WebView在Application中预创建
预加载包含文章详情页所需的css、js的空html
在列表页预加载文章详情所需的内容使用LRU内存缓存并保存到本地数据库
在文章详情页获取预创建的WebView(预加载了html),直接调用js设置页面内容
通过js控制图片的显示,图片懒加载(当图片在可见区域或即将可见才会加载图片),点击加载图片等
抓包的原理
要实现对App的网络数据抓包,需要监控App与服务器交互之间的网络节点,监控其中任意一个网络节点(网卡),获取所有经过网卡中的数据,对这些数据按照网络协议进行解析,这就是抓包的基本原理。
但是中间网络节点,不受我们控制,所以基本无法实现抓包的,只能在客户端和服务端进行抓包。
本地网络指的是WIFI的路由,如果直接抓路由器的包还是比较麻烦的,因此我们会在手机和本地路由之间加一层代理服务,这个代理服务由抓包工具去做,手机通过代理服务器的本地Ip地址和端口连上,手机将请求发送给代理服务器,代理服务器去请求手机发出的请求,然后返回给手机客户端。如果代理服务器退出,手机仍然是代理状态,找不到代理服务器,那么就请求不了数据,此时就得先退出代理状态了。
网友评论