如何上传自己的工具类到MavenCentral里?
前言最近工作也比较忙,难得有时间闲下来在自己的博客中写篇文章。距离上次发表文章已经有 10个月了,故赶紧水一篇文章出来。
这篇文章将讲述如何将自己写的工具类或者开源框架打包发布到 MavenCentral 中,让自己的朋友或者同事能够远程使用你的代码。
比如,在 build.gradle 中加入依赖:implementation("io.github.cofbro:mvvmutils:1.0.0"),就能够将你的 jar包 下载到本地使用。
☑️ 接下来,我将以成本最小、效率最高的方法带你完成整个过程,那么进入正题。
准备好原材料现在你想把你写的完美无敌精妙的代码发布到 MavenCentral 中,首先需要上传到 github 中。
ps:这一步不会的同学请自行百度⚡
注册一个 sonatype 账号进入官网 sonatype
点击 新建 ,然后 问题类型 选择 New Project,概要 就随便输一个相关的名字就ok。
接下来:
Group Id: io.github.<Your github username>
Project URL: ...
ThreadLocal详解
ThreadLocal是什么?ThreadLocal是线程之间进行协作和共享的重要工具,可以保证并发中的线程安全。
当我们定义好了ThreadLocal变量后,每个线程就会持有这个变量的副本,各个线程就可以单独操作这些变量而不会互相影响,当然我们也可以使用锁的方式来代替,用ThreadLocal这种方案不过是用了空间来换时间了。
一句话,ThreadLocal可以避免并发场景下的线程安全问题,因为你访问ThreadLocal变量实际操作的是自己线程中保存的副本。
ThreadLocal的使用举个例子,在main线程中开启五个线程,每个线程都去修改 express对象 中的ThreadLocal变量的值,我们来看看是个什么情况。
1234567891011121314151617public class Express { //定义 ThreadLocal 变量,并将它的值初始化成100 ThreadLocal<Integer> tl = new ThreadLocal<Integer>() { //重写 ini ...
Android九宫格解锁视图
前言今天我们来手写一个关于手机九宫格解锁的一个 view ,我们将各种方法包括向外部传出密码的功能进行封装,写成我们自己的一个 view 。
效果展示
说明:此视图中的子控件全部都是 ImageView ,这里没有用到绘制
分析我们首先来说明一下这个小demo的一些细节。
1.已经点亮的点不能重复点亮
2.已经点亮的点不能与其他任意一点之间形成连线
3.当手指完成九宫格解锁时,要向外部,如 Activity 传递 password ,由外部来判断密码是否正确
界面的布局首先从界面的布局开始说起,九宫格顾名思义有九个点,其次就是6条横线,6条竖线,4条向右下方倾斜的线以及4条向左下方倾斜的线。接下来我们用代码的方式创建这些视图。
很显然我们需要一个容器来容纳下这些子控件,因此我们自己取名的视图 PicUnlockView 需要继承 ViewGruop ,并且它的三个构造方法我们都写出来
123456789101112131415161718192021class PicUnlockView : ViewGroup { /** * 有三个构造方法,其中第三个构 ...
Android版计算器
前言计算器是每个手机自带的必备功能,生活中常用来计算比较大型复杂的数据,今天我准备自己写一个计算器APP出来,以巩固Android学习。
分析与设计对于整个计算器软件的编写,我们分为两大部分,第一部分是UI设计,另一部分是逻辑实现。
UI设计通常程序猿不需要懂太多的UI设计,但是简单的UI设计我们还是需要学会。计算器我们见得多了,最常见的就是顶部一个方形的显示屏,接着下面就是10多个按键,这些按键大多是圆形的,有了这些常识,我们倒不妨画个图。
这就是整个计算器大概的样子。
确定布局那么接下来就是真正实现UI界面的时候了。个人觉得现在constraintLayout(约束布局)最好用,因为动动手指就能实时为你展现UI界面,特别直观与方便,因此根标签就是constraintlayout了。
整个布局是这样的
确定视图种类和数目显示屏就是一个TextView,而其余的按键都是Button,总的来说就是需要16个Button和3个icon图标以及一个TextView,为每个Button和icon以及TextView添加监听事件,实现相应的逻辑即可。
实现圆形Button为了能改变Butt ...
FlyingBirds
一.前言学校安排的学年设计,需要交一份基于Java或c++编写的小游戏,我自然是选择Java了,我准备交一份《飞翔的小鸟》游戏上去。在这里记录一下整个项目的过程。
飞翔的小鸟想必大家小时候都玩过,我记得我当时偷偷玩手机的时候还下载过这个游戏,没想到有一天我会亲手写这个游戏。
二.分析在写代码量较多,结构稍复杂的程序中,我们首先要建立UML类图。首先要明确有哪些对象,从以前我们玩这个游戏的经验来说,第一个必须是要有会飞的小鸟,那么它怎么会飞呢?我们只需要多张小鸟扇动翅膀的图片,然后按顺序在屏幕前闪过,这个小鸟就像实在飞行中的状态了。第二,需要天空类和地面类以及障碍物类。最后根据各自需要实现的功能来编写其类中的方法。
我们来看看具体的UML类图:
我们照着UML类图,一步一步剖析。
1.Column类这个就是障碍物柱子,我们需要考虑其宽度与高度以及钢管空隙,这样才能判定小鸟是否撞在了柱子上,最后还需要一个能让障碍物无限循环的动画。
123456789101112131415161718192021222324252627282930313233class Column { ...
随便说说
随便说说自从期末复习周开始我就已经很久没有写过博客了,全都是为了应付学校里的考试,真的是太多了-_-||,这学期考试大概有10几门,不过终于熬过考试月了,还是不错了。
现在我又有了新任务,第一个是学校安排的学年设计,我打算就模仿一下经典的飞翔的小鸟((^▽^)),还有一个就是互联网+我所负责的网页设计,最后就是还要学习安卓课程,确实挺累的…今年暑假也就没有了。
有关Java多线程
一.关于多线程如果要处理多个业务时,而这些业务之间没有很强的依赖,如A,B,C,此时不按顺序执行这三个业务。当A出现阻塞时,此时CPU是空闲的,我们可以先让B加载进CPU进行执行,当A没有被阻塞时再将A让CPU执行,这样效率明显要高于顺序执行。多线程解决的是并发的问题,目的是使任务执行效率更高,实现前提是“阻塞”。它们看上去时同时在执行的,但实际上只是分时间片使用CPU而已。
二.进程与线程线程是比进程更小一级的执行单位,一个进程可以包含多个线程。多进程操作系统能同时运行多个进程(程序),由于 CPU 具备分时机制,所以每个进程都能循环获得自己的CPU 时间片。由于 CPU 执行速度非常快,使得所有程序好像是在同时运行一样。我们最常见的就是main方法可以看做一个进程或者是一个主线程,而在main方法里面开启的线程就是其子线程,他们同时存在,也可以同时运行。
三.开启线程的方式1.继承Thread类定义一个类,继承Thread类,并重写Thread类的run()方法。run()方法是线程要完成的功能。创建一个继承了Thread类的对象,产生一个线程。并使用该对象的start方法,启 ...
算法练习:不同的二叉搜索树(动态规划)
一.前言LeetCode 题目:96. 不同的二叉搜索树给你一个整数 n ,求恰由 n 个节点组成且节点值从 1 到 n 互不相同的 二叉搜索树 有多少种?返回满足题意的二叉搜索树的种数。
示例 1:
输入:n = 3输出:5
示例2:
输入:n = 1输出:1
题目很简洁,但是分析起来却有点复杂,首先搞清楚什么是二叉搜索树。二叉搜索树分为左子树和右子树,左子树还能再分为左子树和右子树,就像这样:
二叉搜索树有三个条件:
若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值
若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值
它的左、右子树也分别为二叉搜索树
二.分析思考我们将 dp 数组定义为 1 到 n 互不相同的二叉搜索树的个数,先来尝试写写 n = 1 和 n = 2的情况
这两个其实还挺简单的,再来看看 n = 3 的时候这个时候不同的二叉搜索树就有 5 个了,我们来看看这五个是怎么根据前面的结果推导出来的。此图片中前两棵树是根据 dp[2]中的第一个二叉搜索树得出来的,他们结构都是一样的,都是没有左子树,右子树有两个结点。而 ...
Kotlin之lambda 表达式与高阶函数
一.lambda 表达式lambda 在 Java 里面也有,不过 Kotlin 中的 lambda 使用起来更方便、更灵活。lambda 其实就是匿名函数,能使代码变得更加灵活简洁,其表达式为: {变量定义 -> 代码块} , 如:{ a, b -> a + b }
lambda 函数是一个可以接收任意多个参数(包括可选参数)并且返回单个表达式值的函数
1、lambda 函数比较轻便,即用即仍,很适合需要完成一项功能,但是此功能只在此一处使用,连名字都很随意的情况下;2、匿名函数,一般用来给 filter, map 这样的函数式编程服务;3、作为回调函数,传递给某些应用,比如消息处理
完整的 lambda 表达式
123val method: (num1: Int, num2: Int) -> Boolean = { a: Int,b: Int -> a < b }
完整语法形式的参数声明放在圆括号内,其中 num1 和 num2只是变量的声明,可以不写,但是后面的 ...
算法练习:整数拆分(动态规划)
一.前言最近一直在了解动态规划,这是 LeetCode 上面的一道动规的题。
343. 整数拆分
给定一个正整数 n ,将其拆分为 k 个 正整数 的和( k >= 2 ),并使这些整数的乘积最大化。返回 你可以获得的最大乘积 。
示例1:
输入: n = 2输出: 1解释: 2 = 1 + 1, 1 × 1 = 1。
示例2:
输入: n = 10输出: 36
解释: 10 = 3 + 3 + 4, 3 × 3 × 4 = 36。
二.思路说到动态规划,我认为最重要的就是确定自己的 dp数组 的含义,其次就是 递推公式 了。
确定 dp[i] 的含义
我们重新浏览一遍题,给定一个正整数 n ,需要将它分成若干个整数,返回最大的乘积。因此我们可以定义 dp[i] 表示每个正整数拆分为若干个正整数所对应的最大乘积,若要确定 dp[i] 的值,我们可以根据 dp[i] 以前的元素进行运算从而得到最大的dp[i] 的值。
确定 dp[i] 的值
dp[i] 的值是由两种方式来共同确定的。第一,dp ...