java
文章平均质量分 90
Super-B
这个作者很懒,什么都没留下…
展开
-
Java线程池原理解析
ThreadPoolExecutor执行execute方法分下面 4 种情况。如果当前运行的线程少于 corePoolSize,则创建新线程来执行任务,这一步骤需要获取全局锁。如果运行的线程等于或多于 corePoolSize,则将任务加入 BlockingQueue。如果队列已满,则创建新的线程来处理任务 ,这一步骤需要获取全局锁。如果创建新线程将使当前运行的线程超出 maximumPoolSize,任务将被拒绝,并执行拒绝策略。原创 2023-10-11 19:01:33 · 184 阅读 · 0 评论 -
红黑树的删除(下篇)
红黑树插入操作类似,红黑树的删除操作也是通过 重新着色(recoloring) 和 旋转(rotation) 来保证每一次删除操作后依旧满足红黑树的属性的。原创 2022-09-24 19:36:43 · 252 阅读 · 0 评论 -
字符串匹配(BF算法,KMP算法)
最近刷leetcode,刷到了字符串匹配算法,算法链接:实现strtStr()1.BF算法一开始解决这题的基本思想就是暴力匹配了,也就是BF算法,主串A,模式串B、对A串从头遍历到尾,每个位置都和B串进行一一比对,有一个位置不等,那么遍历A串的下一个位置,直到A串中字串有和B相等的或者A串遍历到尾部了就结束。实现代码如下: public int strStr(String haystack, String needle) { if (needle == null || needl原创 2021-12-23 18:28:07 · 924 阅读 · 0 评论 -
安卓Loop机制剖析之Looper,handler
目录Looper是什么简单使用从源码了解loop原理myLooper()next()handler.dispatchMessagehandler分析消息入队同步屏障Looper是什么用于为线程运行消息循环的类。默认情况下,线程没有与之关联的消息循环。要创建一个,在要运行循环的线程中调用 prepare(),然后调用loop()让它处理消息,直到循环停止为止。与消息循环的大多数交互是通过 Handler类进行的。意思大概就是让线程有处理消息的能力,并且这种能力是无限循环的,直到被停止为止。简单使用原创 2020-08-29 21:44:28 · 1539 阅读 · 0 评论 -
安卓Loop机制剖析之ThreadLocal
ThreadLocal是什么ThreadLocal是Thread的局部变量,用于编多线程程序,对解决多线程程序的并发问题有一定的启示作用,ThreadLocal为解决多线程程序的并发问题提供了一种新的思路,使用这个工具类可以很简洁地编写出优美的多线程程序。简单使用解释其实还是很抽象的,下面展示一个demo,来看下threadLocal对象怎么使用的。 public void threadLocal(){ final ThreadLocal<String> t=new Thread原创 2020-08-29 18:02:54 · 410 阅读 · 0 评论 -
Okio基本使用以及源码分析
Okio是什么在OkHttp的源码中经常能看到Okio的身影,所以单独拿出来学习一下,作为OkHttp的低层IO库,Okio确实比传统的java输入输出流读写更加方便高效。Okio补充了java.io和java.nio的不足,使访问、存储和处理数据更加容易,它起初只是作为OKHttp的一个组件,现在你可以独立的使用它来解决一些IO问题。先看下okio库中类之间的关系:okio中最关键的是对于缓存队列的管理,这些优化操作使得okio在复制数据的时候可以减少拷贝次数,来看下okio中数据保存的数据结构是原创 2020-08-24 01:24:00 · 694 阅读 · 0 评论 -
从源码剖析RxJava基本工作原理(4),Schedule调度器的实现
Schedule调度器rxJava的调度器还是比较复杂的,继承关系比较复杂不说,而且有很多内部类,绕来绕去的有点恶心。但是嘛,先把图画出来再说,跟着图的路线走,总不会迷路的。首先我们使用的schedule的方式就是.subscribeOn(Schedulers.io()) 那么就从这个IO()函数入口去看下,里面是个什么东西, @NonNull public static Scheduler io() { return RxJavaPlugins.onIoScheduler(IO);原创 2020-08-20 17:26:05 · 438 阅读 · 0 评论 -
FutureTask的使用以及源码剖析
FutureTask类图我们首先来画一下类图,好分析这个类的逻辑流程以及功能:从图中可以知道,它继承了runnable接口以及future接口,那么说明这个类可以用来执行线程的异步任务,也可以用来将异步结果同步接受。 public static void main() { ExecutorService executor = Executors.newCachedThreadPool(); Task task = new Task(); Future原创 2020-08-19 15:35:06 · 220 阅读 · 0 评论 -
从源码剖析RxJava基本工作原理(3)
subscribeOn操作符上一节我们分析了observerOn操作符,它是可以切换onNext,onComplete所在线程的,也就是事件消费的线程;这一节我们来分析subscribeOn操作符,这个操作符是用来切换createEmitter类的subscribe方法的线程的,也就是切换事件发射所在的线程。demo实例按照惯例还是用一个demo代码来说明我们的subscribeOn操作符的作用以及用法。代码如下: Log.e(TAG,"主线程ID:"+Thread.currentT原创 2020-08-18 17:58:32 · 167 阅读 · 0 评论 -
从源码剖析RxJava基本工作原理(2)
RxJava线程切换我们知道使用rxJava的最重要使用场景就是获取网络请求数据或者是数据库数据等等异步耗时操作的,所以对rxJava线程切换的掌握也十分重要,这一章我们来讲一讲rxJava的线程切换是怎么实现的。简单demo使用 Log.e(TAG,"主线程ID:"+Thread.currentThread().getId()); Observable.create(new ObservableOnSubscribe<Integer>() {原创 2020-08-17 11:11:42 · 189 阅读 · 0 评论 -
从源码剖析RxJava基本工作原理(1)
什么是RxjavaReactiveX是一个通过使用可观察序列来编写异步和基于事件的程序的库。它扩展了观察者模式以支持数据和/或事件序列,并增加了运算符,使您可以声明性地组合序列,同时抽象出对低级线程,同步,线程安全性,并发数据结构和非线程等事物的关注阻塞I / O1.简单实例以上文字的描述很精炼的说出了rxJava是干啥的,以及它的优点,下面我会从简单的使用案例中去剖析rxJava的工作原理。Observable.create(new ObservableOnSubscribe<Intege原创 2020-08-15 21:28:42 · 248 阅读 · 0 评论 -
从源码分析Dialog,PopWindow为啥需要用activity的context创建,而不能用application。
目录欢迎使用Markdown编辑器Dialog的创建Dialog的show方法WMS对应窗口的管理如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入欢迎使用Markdown编辑器先来一张图展示,activity的结构和内容。可知 activity,phoneWindow,原创 2020-07-17 15:56:39 · 994 阅读 · 0 评论 -
安卓frame层异常错误排查
今天countly平台上出现了bug错误,日志如下:java.lang.RuntimeException: Unable to start activity ComponentInfo{cn.com.egova.egovamobile/cn.com.egova.egovamobile.media.CameraActivity}: android.view.InflateException: Binary XML file line #324: Error inflating class cn.com.eg原创 2020-06-01 19:21:00 · 2293 阅读 · 0 评论 -
安卓请求ssh服务器参数中文,出现乱码现象
一、Tomcat默认编码ISO8859_1修改为UTF-8由于tomcat这款软件不是中国人开发的,所以他的默认编码格式是:iso-8859 所以只有通过在服务器配置文件中配置编码,系统才能以不出现乱码。其实很简单,只是每次遇到总忘记在哪里配,怎么配,记录在这里,方便以后查找~在tomcat/conf/server.xml中找到 Connector 在后面加上 URIEncodin转载 2016-01-20 12:44:14 · 726 阅读 · 1 评论 -
Retrofit的动态代理
Java中的动态代理: 首先动态代理是区别于静态代理的,代理模式中需要代理类和实际执行类(被代理的类)同时实现一个相同的接口,并且在每个接口定义的方法前后都要加入相同的代码,这样有可能很多方法代理类都需要重复。而动态代理就是将这个步骤放入运行时的过程,一个代理类只需要实现InvocationHandler接口中的invoke方法,当需要动态代理时只需要根据接口和一个实现了Invocatio原创 2017-10-12 15:11:54 · 1406 阅读 · 0 评论 -
RxJava的源码分析
基本结构我们先来看一段最基本的代码,分析这段代码在RxJava中是如何实现的。Observable.OnSubscribe<String> onSubscriber1 = new Observable.OnSubscribe<String>() { @Override public void call(Subscriber<? super String> subscriber) {原创 2017-10-12 19:47:52 · 288 阅读 · 0 评论 -
做后台遇到的几个问题
1.选用框架SSH已经被淘汰,流行的是SSM,加上现在的微服务的概念,趋势是越来越轻型,越来越小型化,所以框架的持久层选用mybaitis,资源管理万年不变的spring,整个架构springmvc。正式这种概念的产生让我对后台越来越感兴趣。我在做安卓开发的这段时间里面,看了比较多的框架设计的东西,现在再来学习ssm框架,有一种豁然开朗的感觉,大家所声称的框架的优势,也越来越被我所理解,好的东西都原创 2017-11-12 23:03:35 · 521 阅读 · 0 评论 -
android组件化打包module遇到的问题总结(打包成aar)
在一开始接触APICLoud平台的时候我是拒绝的,因为对于一个有着熟练的java技能,掌握着老旧设计模式的人来说,这种平台简直就是对于程序员这个职业的侮辱。第一个原因是APICLoud平台剥离了原生开发和html+js开发的职责,使得原生开发的职业方向越来越窄,开发中的地位也逐渐下降;第二个原因是,这个平台完全是无脑式开发,所有的js框架都是封装好的,只需要像jQuery一样直接调用就好了,API...原创 2018-04-28 11:36:24 · 14576 阅读 · 0 评论 -
js和java交互
没什么要说的,就是在java调用js函数的时候出现没有反应的情况,最后发现问题是,java调用js的代码需要在主线程中执行,所以用handle.post之后就可以执行了。...原创 2018-07-05 20:34:44 · 1124 阅读 · 0 评论 -
关于recycleview内部嵌套expandlistview的问题
1.expandlistview的高度不能铺满到recycleview的item中,就需要重写expandlistview的onmeasure方法:@Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { // 解决显示不全的问题 int expand...原创 2019-03-14 16:56:55 · 630 阅读 · 0 评论 -
单台电脑配置多个git账号
假设现在你已经配置了一个账号在电脑上,现在开始配置第二个账号。分为三步:1.生成一个ssh_Key: 在生成密钥的时候进行文件命名,避免重复覆盖原来的key.2.将新生成的key添加到git账号中。...原创 2019-08-21 21:17:58 · 144 阅读 · 0 评论 -
java动态代理
java代理模式在java程序设计中非常常见,比如说在spring框架中,使用的aop功能,就是动态代理的方式加入我们的切面功能,从而不会侵入到原始代码中而带来增强功能的效果,在java代理模式中,我们又将代理模式分为静态代理和动态代理。静态代理静态代理,就是继承相同的接口,然后把需要被代理的类当作参数传入到我们的静态代理内部当作成员变量,然后静态代理的方法内部就调用被代理类的方法,在该方法内部也可原创 2017-07-13 13:32:07 · 520 阅读 · 0 评论 -
换肤框架
在进行换肤框架讲解之前,我先把View创建过程说一下:调用Context.getSystemService()方法[java] view plain copyLayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER原创 2017-06-10 19:26:20 · 369 阅读 · 0 评论 -
Spring注解的实现原理
要理解java注解首先要掌握几个概念,第一字节码中的attribute_info区域的作用,第二java反射,第三xml的解析。注解起作用的过程中,注解信息只起着配置信息的作用,注解没有行为,没有动作,就把它看成是存储在attribute_info中的一段字符串就行了。1.字节码中的attribute_info属性 如上图所示,显示的是java代码编译后字节码的结构,u2代表当前结构体占2个字原创 2017-08-11 16:38:29 · 23164 阅读 · 4 评论 -
Java NIO和IO的主要区别
当学习了Java NIO和IO的API后,一个问题马上涌入脑海:我应该何时使用IO,何时使用NIO呢?在本文中,我会尽量清晰地解析Java NIO和IO的差异、它们的使用场景,以及它们如何影响您的代码设计。下表总结了Java NIO和IO之间的主要差别,我会更详细地描述表中每部分的差异。IO NIO面向流 面向缓冲阻塞IO转载 2016-10-14 15:53:38 · 336 阅读 · 0 评论 -
自定义图片视图的坑
/** * Created by fxl on 2016/8/22. */public class RoundImageView extends ImageView { /** * 图片的类型,圆形or圆角 */ private int type; private static final int TYPE_CIRCLE = 0; pri原创 2016-08-25 00:25:43 · 349 阅读 · 0 评论 -
安卓Spinner控件的Bug
Spinner控件可以监听,但是监听的话,如果两次点击都是同一个item的话,那么就就不会触发,因为看源码的话就会发现,在Spinner中有一个保存上次点击的位置的变量叫做 mOldSelectedPosition的变量,每次点击的时候就会验证两次点击是否是同一个item,不同就触发点击事件,因此可以修改mOldSelectedPosition变量,让控件两次点击相同都可以触发。但是私有变量也原创 2016-07-15 14:28:04 · 1109 阅读 · 0 评论 -
listview多个子样式的回收复用问题
如图所示:listview的滑动,都会带出新的new_item出现,old_item移出屏幕的时候会被回收,new_item其实就是old_item,这个item就是getview的convertview参数,现在假设这样一种情况,一共有4种布局,最开始的三项都是不同的样式,如下图所示:就前三项占据了一屏幕了,后面都是一样的第四类布局,这样如果使用回收机制的话,原创 2016-06-17 14:01:17 · 914 阅读 · 0 评论 -
关于安卓请求服务器的session问题
安卓用http请求服务器的时候,第一次会请求会产生一个sessionID,服务器就会保存这个seesionID。我们只需要在安卓端把sessionID保存起来,下次请求的时候设置http请求seesionID,这样服务器就会认为这两次请求都是同一个网络请求,这样就不需要每次都要验证安卓端了,浏览器之所以不用这样做,估计是已经自动完成了这样的操作。具体代码如下:原创 2016-06-26 13:57:21 · 3721 阅读 · 0 评论 -
下来框取的被选中的项的值
现在有一id=test的下拉框,怎么拿到选中的那个值呢?分别使用javascript原生的方法和jquery方法 text1 text2 code:一:javascript原生的方法 1:拿到select对象: var myselect=document.getElementById("test"); 2:拿到选中项的索引:var i转载 2015-07-24 19:04:30 · 611 阅读 · 0 评论 -
拦截器和过滤器
1. ajun_studio 的观点 Filter基于回调函数,我们需要实现的filter接口中doFilter方法就是回调函数,而interceptor则基于java本身的反射机制,这是两者最本质的区别。 Filter是依赖于servlet容器的,即只能在servlet容器中执行,很显然没有servlet容器就无法来回调doFil转载 2015-08-04 13:24:56 · 545 阅读 · 0 评论 -
java做图片加水印的功能代码
import java.awt.AlphaComposite;import java.awt.Color;import java.awt.Font;import java.awt.Graphics2D;import java.awt.Image;import java.awt.RenderingHints;import java.awt.image.BufferedImag转载 2015-08-12 12:24:36 · 767 阅读 · 0 评论 -
action的变量在jsp中的取值问题
一.action中只要有变量的get/set方法,就可以在JSP页面上使用: 1.的方式定义变量获取,例如。 在JS函数里面可以定义变量赋值使用 var compid=; 2.可以使用EL表达式原创 2015-07-30 14:59:05 · 1076 阅读 · 0 评论 -
利用贝塞尔函数仿QQ红点提示
直接贴代码,不废话了最主要的就是计算几个点的坐标问题,然后用二阶贝塞尔函数画出连接区域用p1与p4的中心点作为上半个不规则形状的贝塞尔曲线的的控制点用p3与p3的中心点作为下半个不规则形状的贝塞尔曲线的的控制点然后知道起点和重点,实时绘制贝塞尔曲线,然后把封闭区域用红色填充就可以了。重点在于切点的计算:高中数学学的不好花了很久才算出来。太菜了PointCom原创 2016-09-26 17:54:57 · 586 阅读 · 0 评论 -
三种广播,以及广播接收器的注册方式
广播有三种:1.普通广播,只是普通的广播,接受顺序按配置的优先级接受,只有注册了对应的过滤器的接收器才能接受。2.有序广播,接受顺序按配置的优先级接受,只有注册了对应的过滤器的接收器才能接受,接收器可以截断广播,排在后面的接收器接收不到广播。3.粘性广播,已经被弃用了,广播发送后一直留在AMS中,即使是在粘性广播发送后再注册的接收器还是可以接收到粘性广播,这样的话该广播是不会停止的,只原创 2017-06-07 16:40:17 · 2618 阅读 · 0 评论 -
关于struct2获取jsp表单里的数据,以及隐藏传递给action的变量的方法
1.获取jsp表单的方式就是把form里面的input空间的name设置成action方法里面对应变量的变量名,并且变量在action需要对应的get/set方法就行了,2.要解决传值给action的变量隐藏问题,只有用post方式,首先这种方式只有submit控件能解决,所以必须用到表单提交,第二呢就是我们并不需要表单显示在页面上,所以我们就需要定义一个表单,然后把我们所需要传递的值全部赋值转载 2015-07-28 17:55:37 · 2870 阅读 · 0 评论 -
从编译角度看java域和方法
上图展示了,我们java类是如何从java字节码文件中加载到内存中,再从内存中解析到方法区中的。java域的编译而我们的java域初始化是在解析和初始化这两个阶段完成的,解析先把域中基本类型和String类型初始化为0和“”,域中引用类型初始化为null(系统默认设置),然后在初始化阶段进行和的初始化(用户代码设置)。 而域又分为静态域和非静态域。 静态域:在中初始化,属于类变量被存储在方法区中原创 2017-07-09 15:07:24 · 801 阅读 · 0 评论 -
从编译过程看内部类和lambda表达式
什么是内部类内部类按名称分为:匿名内部类,和非匿名内部类。 非匿名内部类又分为:静态内部类和非静态内部类。有时候我们会发现,修改外部类的某个方法使得它访问了内部类的某个方法,编译之后就会发现字节码中会多出来一个额外的方法,所以为了了解原理,还是要看看编译期间它到底做了什么。第一点我们都知道,内部类在编译期间会被编译成一个和外部类一样的顶级类。1 静态内部类/非静态内部类的区别 静态内部类/非静态原创 2017-07-09 13:36:30 · 3028 阅读 · 5 评论 -
从编译过程看java的泛型
为什么需要泛型?在1.5之前是没有泛型的,而通常使用object来泛化我们所有的对象,这样做也可以让我们达到泛型的目的,但是在代码编写的过程中很容易出现类型转换的错误,这种错误在编译期间是不知道的,只有到运行期间才知道。 比如: List list=new List(); list.add("aaaa"); list.add(12); int a= (int) list.ge原创 2017-07-09 12:30:14 · 2193 阅读 · 0 评论 -
Android视频直播原理
最近视频直播简直火的一塌糊涂,为了能赶上这趟顺风车飞起来,我决定研究一下视频直播方面的知识,为以后的进阶做准备。先梳理一下直播的流程: 硬件采集——>处理(滤镜水印)——>编码和封装——>推送到服务器——>服务器分发——>播放器流播放(视频流的解码和读取) 1.采集采集是整个视频推流过程中的第一个环节,它从系统的采集设备中获取原始视频数据,将其输出到下一个环节。视频的采集涉及两方面数据的采集:音翻译 2017-07-14 10:25:22 · 792 阅读 · 0 评论