- 博客(65)
- 收藏
- 关注
原创 安卓高级开发之自定义View(二)
1.前言我的上一篇文章,介绍了如何自定义ViewGroup,演示了如何定义一个流式布局。那么今天我想阅读一下FrameLayout的源码,学习一下系统是如何自定义布局的。学会阅读源码是很有必要的。2.直接上源码在阅读源码中,我们只需要关注onMeasure()和onLayout()方法。源码中,我已经加了注释,希望可以方便大家阅读。我画了一个示意图,方便大家理解://我们只需要关注onMeasure()和onLayout()方法public class FrameLayout e
2020-10-06 18:00:40
478
原创 安卓高级开发之自定义View(一)
1.什么是自定义View安卓中自定义View就是根据需求自己设计一个组件,这就包括继承View或View的派生类,然后去重写内部方法。通常来说自定义View分为三种:继承View,自定义组件; 继承View的派生类,即系统提供的组件; 组合型控件,自定义组件中包含了其他组件。2.在自定义View的步骤1.测量 onMeasure(),即确定控件的长和宽;2.布局 onLayout(),即确定控件的摆放位置;3.绘画onDraw(),即确定控件的样式。在自定义ViewGrou
2020-10-05 18:49:25
441
原创 面向Socket编程,实现Java客户端向服务器发送http请求
文章目录前言 一、pandas是什么? 二、使用步骤 1.引入库 2.读入数据 总结前言作为一个合格的程序员,不能不懂网络编程,说到网络编程,Socket编程作为网络通信的底层API,对我们了解那些网络框架的原理,大有助益。一、pandas是什么?二、使用步骤总结...
2020-09-22 10:24:38
1102
原创 初识MVVM架构模式
文章目录前言 一、pandas是什么? 二、使用步骤 1.引入库 2.读入数据 总结前言MVVM是MVC的改进版,和一、pandas是什么?二、使用步骤1.引入库2.读入数据总结
2020-09-17 11:48:13
658
原创 使用Mac 终端发送http请求
1.curl www.baidu.com在终端输入上面指令可以获取到百度服务器传过来的html,上面默认请求方式是get。如图:2.curl -v www.baidu.com可以看到详细请求和响应过程:3.curl --data "参数名=值" url这是post请求方式。...
2020-09-15 11:26:15
3945
原创 简单的聊一下Handler的原理
Handler是安卓消息体系里面很重要的一个部分,它实现了线程之间的通信,没有它,安卓将无法正常运行。1.各部分介绍:1.message:消息;2.MessageQueue:消息队列;3.Looper:消息循环器;4.Handler:可以通过sendMessage()发送message到MessageQueue,之后通过Looper.loop() 开始循环MessageQueue不断获取消息,再将消息交给Handler,由handleMessage()处理消息。2.原理介绍:2.
2020-08-31 16:07:36
182
原创 安卓Jar和Aar的区别以及更新UI的几种方式
Jar包里面只有代码,Aar包里面不止有代码,还有资源,如图片,XML等。对于一些不常变动的Android库文件,建议直接引入AAR,加快编译速度。2.安卓几种更新UI的方式1.Activity.runOnUiThread(Runnable);2.View.post(Runnable),View.postDelay(Runnable,long)(可以理解为在当前视图UI线程添加队列)...
2020-08-05 17:07:24
437
原创 Android有几种解析XML的类,他们有什么区别
1.DOM解析DOM是一种用于XML文档的对象模型,可用于直接访问XML文档的各个部分。它是一次性将全部内容加载到内存中,生成一个树状结构,它没有涉及回调和复杂的状态管理。缺点是加载大文档时,效率低下。...
2020-08-05 11:15:59
613
原创 Context相关和Android各版本新特性
1.Activity和Service和Application的context是不一样的,Activity的context继承自ContextThemeWrapper。其他继承自ContextWrapper。2.每一个Activity和Service以及Application的context都是一个新的contextImpl对象。3.在Activity和Service中,可以通过getApplication()用来获取Application的实例。但是在BroadcastReceiver要通过getA
2020-07-30 17:28:37
161
原创 Bundle传递对象为什么需要序列化,Serialzable和Parcelable的区别
因为bundle传递数据时,只支持基本数据类型,所以在传递数据时,要将对象序列化转化成可以存储或者可以传输的本质状态,即字节流。序列化后的对象可以在网络,页面之间传递,也可以存储到本地。Serialzable(Java自带)序列化对象,转化成可以存储或者可以传输的本质状态。Parcelable(安卓专用)Parcelable可以实现相同的效果,但是不是将对象序列化,而是将对象进行分解,分解后的每一个部分,都是Intent所支持的数据类型,这就也实现了传递对象的功能了。比较:Serialz
2020-07-29 17:27:02
1065
原创 横竖屏切换时Activity的生命周期情况及Android进程优先级
1.安卓3.2(API 13)之前:不设置Activity 的 android:configChanges 时,切屏会重新调用生命周期,切横屏调用一次,切竖屏调用两次。 设置 Activity 的 android:configChanges="orientation" 时,切屏都会重新调用生命周期,切横屏和竖屏都是调用一次。 设置 Activity 的 android:configChanges="orientation|keyboardHidden" 时,切屏不会调用生命周期,但是会调用onCon
2020-07-27 11:40:39
230
转载 AsyncTask的原理
1.AsyncTask是什么?AsyncTask是一种轻量级的异步任务类。它可以在线程池中执行后台任务,然后把执行的进度和最终的结果传递给主线程,并在主线程中更新UI。2.关于线程池AsyncTask对应的线程池是ThreadPoolExecutor都是进程范围内共享的,且都是静态的,所以是AsyncTask控制着进程范围内的所有子类实例。由于这个限制的存在,当使用默认线程池时,如果线程数大于最大容量,则线程池会爆掉。这时可以考虑自定义线程池。3.关于默认线程池AsyncTask里面的线
2020-07-22 10:35:50
477
原创 安卓8.0以上版本之静态广播失效问题
1.前言日前开发了一个安卓小组件,使用到了广播,在安卓6.0设备上可以正常使用,但是在安卓8.0设备上就失效了。最后查阅资料得知:安卓8.0以上版本对隐式广播做了限制,导致收不到广播。2.上代码在AndroidManifest.xml里注册了两个广播:<receiver android:name=".view.widget.NewAppWidget"> <intent-filter> <action an
2020-07-21 16:56:34
662
原创 什么是ANR,如何避免它
1.在安卓上,如果你的APP有一段时间响应不够灵敏,系统就会向用户显示一个对话框,这个对话框称之为应用程序无响应(ANR)对话框。如果开发手机上出现这种问题,可以通过查看/data/anr/traces.txt来获取导致ANR的信息,最开始部分为最新信息。一般导致ANR的原因有:1.主线程被IO操作阻塞;2.主线程存在耗时计算;3....
2020-07-09 16:52:40
426
原创 jvm调优的常见指令和参数
1.指令1.jps命令用于查询正在运行的JVM进程。2.jstat可以实时显示本地或者远程JVM进程中类的装载、内存、垃圾收集、JIT编译等数据。3.jinfo用于查询当前运行的JVM的属性和参数值。4.jmap用于显示当前Java堆和永久代的详细信息。5.jhat用于分析使用jmap生成的dump文件,是JDK自带的工具。6.jstack用于生成当前JVM所有线程的快照,线程快照是JVM每一个线程正在执行的方法,目的是定位出线程出现长时间停顿的原因。2.参数1.-Xmx:用
2020-07-03 16:56:37
684
原创 详细的说说Java的垃圾回收机制
首先提起垃圾回收机制,我们需要考虑三个问题:1.那些内存可以回收这个问题涉及引用管理,那么,什么是引用呢?引用:如果reference类型的数据存储的数值代表的是另一块内存的起始地址,就称这块内存代表着一个引用。引用分为4种类型:1.强引用:如 String str = "abc",一般用“=”连接,这就是强引用,在程序代码中普遍存在,只要强引用还在,那么垃圾收 集器就永远不会回收被引用对象。2.软引用:提供SoftReference类来实现软引用,用来...
2020-06-30 11:39:08
356
原创 浅谈JVM的组成
JVM主要由4部分组成:1.类加载器(ClassLoader):在JVM启动时或者类运行时,将需要的class文件加载到JVM中。2.Java内存区:在JVM运行时操作系统分配的内存区。运行时内存区主要可以分为5个部分:方法区(MethodArea):用于存储类结构信息的地方,包括常量池、静态变量、构造函数等。虽然JVM规范把方法区描述为堆的一个辑部分,但是他还有一个别名non-heap(非堆)。方法区还包含一个运行时常量池。 Java堆(Heap):存放实例或对象的内存区域。 Java栈(
2020-06-18 16:59:50
321
原创 如何安全停止一个线程任务
1.终止线程:1.使用violate boolean变量退出标志,使线程正常退出,即线程执行完run方法体后,正常退出(推荐)。2.使用interrupt() 尝试终止线程,但是不一定成功。3.使用stop()强制终止线程。不安全的是:创建子线程的线程会抛出异常,并且会释放子线程持有的所有的锁。2.终止线程池1.shutdown()关闭线程池线程池不会立马关闭,要等添加到线程池的任务都执行完了,才会关闭。2.shutdownNow()关闭线程池并终止任务终止等待执行的线程,并
2020-06-17 16:45:30
661
原创 乐观锁和悲观锁
悲观锁:总是假设最坏的情况:每次去拿数据的时候,都认为值会被别人修改。因此给值加上锁,这样别的线程就不能访问了。如synchronized和ReentrantLock就是悲观锁。适用于多写情形。乐观锁:总是假设最好的情况:每次去拿数据的时候,都认为值不会被别人修改。因此不会给值加锁。但是在更新的时候,会去判断这个数据是否被更新过。可以使用版本号机制和CAS算法实现。乐观锁适用于多读情形,这样可以提高吞吐量。乐观锁的实现方式:1.版本号机制:一般在数据表加一个数据版本号(version
2020-06-16 17:28:49
218
原创 什么导致线程阻塞
线程阻塞的引入:为了解决共享存储区的访问冲突,Java引入了同步机制。显然光有同步机制是不够的,因为任意时刻所需的资源不一定准备好了,反过来,同一时刻准备好的资源也可能不止一个。为了应对这种情况,Java又引入了阻塞机制。阻塞是指暂停某一线程的执行直到满足某一条件,才继续执行。Java提供大量方法来支持阻塞,下面来逐一介绍。sleep():它使线程进入阻塞状态,失去CPU执行时间。指定时间一过,线程重新进入可执行状态。suspend()和resume():它们需要配套使用,suspend
2020-06-15 13:34:06
1394
原创 线程死锁的四个条件
1.死锁是如何发生的?当线程A独占锁a,尝试获取锁b,而线程B独占锁b,尝试获取锁a时,因为线程AB互相持有对方想要的锁,而陷入死锁。2.造成死锁的四个条件1.互斥:某种资源一次只允许一个进程访问,即该资源一旦分配给了某个进程,其他进程就无法访问了。直至该进程访问结束。2.占有且等待:一个进程本身占有资源,还有资源没有得到满足,在等待其他进程释放该资源。3.不可抢占资源:别人已经占有了某项资源,不能因为自己需要,就去抢占资源。4.循环等待:存在一个进程链,使得每个进程都占有下一个进程
2020-06-11 16:59:44
1017
原创 Java多并发的相关知识点
1.多线程的使用场景:使用多线程效率就一定高吗?有时候使用多线程不是为了效率高,而是为了可以同时干几件事。1.为了不阻塞主线程,使用其他线程来做事。如APP的耗时操作就不在UI主线程里面做。2.实现更快的应用程序,即主线程监听用户的请求,子线程去处理用户请求,以获得大的吞吐量。如:JavaWeb主线程监听用户请求,子线程处理用户请求。3.某种虽然优先级很低的服务,但是却要不定时去做。比如JVM的垃圾回收。4.某种操作虽然耗时,但是不消耗CPU执行时间。开个线程执行效率会提高很多。比如:读
2020-06-10 15:48:38
202
原创 ReentrantLock的原理
1.ReentrantLock的简单介绍:ReentrantLock是Java并发包中提供的一个可重入的互斥锁。ReentrantLock和Synchronized在基本用法,行为语义上都是类似的。同样都具有可重入性。但是ReentrantLock可以实现公平锁。2.ReentrantLock具有可重入性,公平锁,非公平锁。可重入性:所谓可重入性,就是可以支持一个线程重复获取锁。公平锁:是指获取锁的策略相对公平,当多个线程获取同一把锁时,必须按照申请锁的时间排好序依次获取锁,不能插队。非
2020-06-09 17:02:48
230
原创 volatile的原理
遇到可见性,有序性,原子性的问题时,我们通常可以使用synchronized关键字来解决。但是我们都知道synchronized是较重量级操作。这时我们可以使用volatile关键字来解决可见性,有序性问题。对于原子性,volatile只支持只读或者只写。如:i++,这种不行,这是又读又写。volatile也是互斥同步的一种实现,他是非常轻量级的。1.volatile的意义:volatile有两条关键语义:1.保证被volatile修饰的变量对所有线程都是可见的;如何保证可见性?被v
2020-06-05 16:51:21
149
原创 Synchronized 的原理
Synchronized代码块是由一对monitorenter(持有monitor对象)/monitorexit(释放monitor对象)指令实现的,monitor对象是同步的基本实现。而synchronized方法,JVM使用ACC_SYNCHRONIZED访问标志来判断是否是一个同步方法,从而执行相应的同步调用。Java6之前,monitor的实现是通过操作系统的互斥锁,因为需要进行用户态到内核态的切换,所以同步操作是一个没有差别的重量级操作。现代的(Oracle)JDK中,JVM对这种情况进行
2020-06-05 10:04:26
161
原创 谈谈对线程池的理解
1.什么是线程池?线程池就是事先将多个线程对象放入一个容器中,当需要使用时,不需要new 线程,直接去线程池拿线程就行了。2.为什么使用线程池?1.节省开辟子线程的时间,提高代码的执行效率。2.方便管控线程并发数。3.Java中一共有 4 种线程池:1.可缓存线程池,不固定线程个数: public static ExecutorService newCachedThreadPool() { return new ThreadPoolExecutor(0, Int
2020-05-20 17:10:12
324
原创 简单谈谈对Java中反射的理解
1.什么是反射:Java的反射机制是在运行状态中,对于任意一个类,都能知道这个类的所有方法和属性,对于任意一个对象,都可以调用这个对象的任意方法和属性。这种动态获取信息和动态调用对象的方法和属性的功能称之为Java的反射机制。反射就是把Java类中各种成分映射成一个个对象。2.反射...
2020-05-14 11:34:52
350
原创 ArrayMap和sparseArray相较于HashMap的改进
当要存储大量数据时,hashMap需要不断扩容,需要不停的做hash运算,这样会极大的浪费内存空间,消耗性能。SparseArray:1.SparseArray比HashMap更加节省空间,在某些情况下,性能也比HashMap强。主要原因是其避免了key的自动装箱(int 转化为integer类型)。2.它内部用两个数组来存储数据,一个存储key,一个存储value。而且为了进一步优化空间,它内部采用压缩数据的方式来表示稀疏数组的数据(数组空间实际使用率低,很多都是空的,造成空间浪费)。3.
2020-05-12 10:33:53
340
原创 ConcurrentHashMap1.7和1.8的区别
ConcurrentHashMap1.7原理:1.底层结构:数组(Segment)+ 数组(HashEntry)+ 链表(HashEntry节点)2.ConcurrentHashMap使用了分段锁技术,当一个线程占用锁访问其中一个Segment时,不会影响访问其他Segment.put()1.先根据key的hash值,找到对应的Segment,在调用Segment的put()。...
2020-05-07 16:18:33
987
原创 HashMap1.7和1.8原理解析
HashMap1.7原理:HashMap的底层实现是:数组 + 链表结构;负载因子:1.HashMap的初始化容量是16,负载因子是0.75,当元素个数达到 16*0.75 = 12 时,HashMap就会进行扩容。扩容就会进行reHash(为key重新计算存放位置),复制数据。非常消耗性能。2.通常如果可以指定HashMap的大小最好,可以减少扩容带来的性能消耗。其实真正存放...
2020-04-27 16:22:38
787
原创 Set如何从原理上保证不重复?
1.在往Set加入元素的时候,如果元素不存在,则添加成功。2.具体来说:在往HashSet添加元素时,首先要计算出该元素的hashcode的值,然后用(该元素的hashcode值)%(集合长度)+ 1得出这个元素的位置。如果这个位置为空,则添加进去。如果不为空,就通过equals()方法比较两者内容是否相同。如果相同,就不添加。反之找一个位置存放。...
2020-04-20 13:28:55
603
原创 集合list、set、map有哪些具体的实现类,区别是什么
Iterator是集合的总接口,其他的集合接口都继承于它,它定义了集合的遍历操作。collection继承了Iterator是次接口,
2020-04-20 11:32:55
1646
原创 Glide图片加载框架简单使用方法
使用场景:1.当你需要从网络上加载图片到APP上时,会用到;2.对图片进行处理时。使用步骤:1.添加依赖:implementation 'com.github.bumptech.glide:glide:4.8.0'annotationProcessor 'com.github.bumptech.glide:compiler:4.8.0'2.直接上手使用Reques...
2020-04-17 15:09:54
237
原创 能否从安卓中举几个列子,分别用到了那些设计模式?
1.AlertDialog、Notification 源码使用了建造者模式完成参数的初始化;优点:1.良好的封装性,隐藏内部实现细节;2.建造者独立,容易扩展。缺点:会产生多余的Builder对象和Director对象,消耗内存。2.安卓应用主题是抽象工厂模式的最好体现安卓应用有两套主题:LightTheme亮色主题和DarkTheme暗色主题。主题之下有各种与之相关的...
2020-04-09 11:05:59
219
原创 代码书写的坏习惯
1.代码重复;2.方法过长;方法要有独立意图,不要将几个意图放在一起。3.类提供的功能太多;类应该提供单一功能。4.数据泥团有些数据一起出现在很多类的成员变量和方法中,应该考虑形成独立对象,以单例的形式对外提供自己的实例。5.冗余类干事情太少,为了减少维护,应该消除掉。6.注释太多注释太多,说明你的代码太复杂,不好理解。参考文章:https:...
2020-04-07 17:12:38
172
原创 Java中有哪几种常见的设计模式
Java中一般认为有23种设计模式,分别是:1.创建型模式,五种:工厂方法模式,抽象工厂模式,单例模式,建造者模式,原型模式;2.结构性模式,七种:...
2020-03-27 14:31:30
4171
1
原创 谈谈对Java多态的理解
多态:继承父类的子类重写父类的某个方法,不同的子类调运同一个方法可以,产生不同的结果。多态的三个必要条件:1.继承父类2.重写父类的方法3.父类的引用指向子类对象面向对象的三大特性封装、继承、多态。从某种程度来看,封装、继承就是为了多态准备的,也是最重要的知识点。实现多态的技术:动态绑定,是指在执行期间,根据引用对象实际指向的对象,来执行对应的方法。多态的作用:消除类型...
2020-03-23 15:18:02
264
原创 安卓权限管理,为啥在清单里面注册权限,就可以使用App,反之不能
1.安卓安全架构的中心设计点是:在默认情况下,任何应用都没有权限执行对其他应用,操作系统,和用户产生不利影响的任何操作。这就包括读取用户信息,访问互联网等。2.由于每一个安卓应用都是在进程沙盒里面运行的,因此他们必须显式共享资源和数据。他们通过声明需要那些权限来获取基本沙盒没有提供的额外功能。应用以静态方式声明需要的权限,在由系统提示用户同意授权。参考文章:https://jueji...
2020-03-20 14:38:39
287
1
原创 Linux的软连接和硬连接
Linux有两种连接,一种叫硬连接,一种叫软连接。默认情况下,In命令产生硬连接。硬连接:定义:保存在Linux的磁盘分区中不管什么文件都有一个编号,称之为索引节点号,多个文件名指向同一个索引节点号,这就是硬连接。作用:允许一个文件拥有多个有效路径名,这样用户就可以把硬连接建立到重要文件上,这样就可以防止误删。也就是说要删除文件,必须将与之相关的硬连接文件全部删除,才能删除该文件。...
2020-03-20 13:51:50
139
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人