- 博客(64)
- 资源 (2)
- 收藏
- 关注
原创 Android APT从入门到实战
APT是什么?有什么用?APT(Annotation Processing Tool)即注解处理器,在编译的时候可以处理注解然后搞一些事情,也可以在编译时生成一些文件之类的。ButterKnife和EventBus都使用了APT技术,如果不会APT技术就很难看懂这两个框架的源码。实现效果我们来实现一个简单的功能,只要在任何类的成员变量上添加一个 @Print注解,就可以动态生成一个方法,然后把成员变量的变量名输出:动态生成的类大概长这样:整理思路首先我们需要创建两..
2021-08-18 16:59:53 6381 5
原创 Android IntentService源码解析
前言众所周知Service是不能执行耗时任务的,一般我们需要执行耗时任务的时候别人都会告诉我们,让我们使用IntentService,那IntentService为什么就可以执行耗时任务呢?IntentService怎么使用?继承IntentService,然后重写onHandleIntent方法public class MyIntentService extends IntentService { public MyIntentService() { su..
2021-07-22 15:17:10 233 2
原创 Android HandlerThread源码解析
前言如果我们要执行多个耗时任务,第一时间想到的肯定是创建多个线程来执行任务,如果学过线程池那我们也可以使用线程池,那有没有比线程池更轻量级的呢?Handler了解一下~纳尼! Handler也可以执行耗时任务吗? 那么问题就来了子线程怎么使用Handler?先来试试能不能用new Thread(new Runnable() { @Override public void run() { Handler handler = new Handler() ..
2021-07-22 13:28:08 249 3
原创 Android Handler源码浅析
前言Android开发的小伙伴对于Handler一定不陌生了,基本面试必问的东西,但是很多人都是死记硬背不了解原理,这样面试很容易就丢分了,所以本文将会简单带大家了解一下Hander源码的实现。因为是浅析,所以有些东西不会讲的太细,但是会带大家把源码走通。上代码public class HandlerActivity extends AppCompatActivity { private Handler mHandler = new Handler() { @..
2021-07-21 14:50:16 240 1
原创 Java并发(三) 线程池详解
为什么要有线程池?如果没有线程池,我们执行100个任务是这样的:for (int i = 0; i < 100; i++) { new Thread(new Runnable() { @Override public void run() { System.out.println("执行任务"); } }).start();}每执行一个任务我们就需要创建一个线程,线程频繁的创建和销毁非常消耗性能,..
2021-07-15 15:07:53 629
原创 Java并发(二) 线程锁机制
为什么要有线程锁?多个线程之间会抢夺资源,所以有可能一个线程执行到一半,就被另一个线程抢夺了资源,这样就会造成线程的不安全,为了保证线程的安全性,我们可以使用线程锁来解决这个问题。比如下面的例子,正常应该打印出两句“今天你学习了吗?”,但是有可能thread1刚执行到一半,thread2就抢夺了资源,所以就会导致执行顺序错乱:public class ThreadDemo { public static void main(String[] args) throws Interrup..
2021-07-15 10:12:10 196
原创 Java并发(一) 线程基础
什么是进程和线程?进程:进程是操作系统进行资源分配的最小单位,一个进程中可以存在一个或者多个线程,同一进程中的线程可以共享该进程中的系统资源,但是进程和进程之间是相互独立的,不同进程间传递消息需要使用跨进程通讯。线程:线程是CPU调度的最小单位,必须依赖进程而存在,同一进程中的多个线程共享进程数据。举例:进程就像是火车,而线程就是这个火车上的车厢,每个火车最少有一个车厢,同一个火车上的车厢可以共享这个火车上的资源。什么是并发和并行?并发:并发指应用能交替执行不同的任务,就像..
2021-07-13 16:16:14 85 1
原创 Java静态代理和动态代理
前言再开始之前我们先不使用任何代理来实现一个网络请求的流程。定义一个请求的接口:public interface Request { void request();}使用OkHttp来实现这个接口public class OkHttpImpl implements Request { @Override public void request() { System.out.println("OkHttp请求成功"); }}现在我们的..
2021-07-12 09:28:36 72 2
原创 Java自定义注解入门到实战
什么是注解?Java 注解(Annotation)又称 Java 标注,是 JDK5.0 引入的一种注释机制。 比如我们常见的@Override和@Deprecated都是注解,注解可以加在类、方法、成员变量等上面,类似于给他们“打标签"。注解怎么定义?public @interface 注解名{}看起来和定义接口很相似只是多了一个@符号接口: public interface 接口名注解: public @interface 注解名public @interface lkx ..
2021-07-08 16:33:21 193 1
原创 Java反射机制
什么是反射?Java 反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为 Java 语言的反射机制。用大白话来说就是反射在运行状态时可以操作任意一个类的全部功能,比如调用方法、修改成员变量的值和调用构造方法等,就算是私有也可以暴力反射,sorry~反射就是可以为所欲为。’我们先创建要反射的类:public class Student { private int ag..
2021-07-05 15:20:16 148
原创 Java泛型从基础到高级
什么是泛型?泛型是JDK1.5中引入的一种"参数化类型"特性.泛型可以限制参数类型,不需要强制类型转换.泛型会在编译器检测类型是否匹配,避免了运行时类型不一致引起的"ClassCastException".泛型的简单使用不使用泛型可以添加任何类型 ArrayList list = new ArrayList(); list.add("hello"); list.add(18); list.add('u');不使用泛型获取数据会转为..
2021-07-02 16:04:19 117 1
原创 Java单链表反转
1. 遍历反转 public NodeBean reverse1() { NodeBean node = headNode; NodeBean pre = null; NodeBean next = null; while (node != null) { next = node.nextNode; node.nextNode = pre; pre = node;
2021-04-26 17:36:13 97
原创 Java数据结构———队列
前言队列与栈的数据结构非常相似,建议两个数据结构对比着看Java数据结构———栈什么是队列?队列是一种先进先出的数据结构,可以理解为一个没有底容器,从顶部进去,从底部可以直接出来,所以先进去的数据一定在最底部,可以从底部直接取出生活中的小例子: 银行排队办理业务,第一个进去的人先排队,后面的人依次排在后面,办理完业务直接走,此时第一个进去的人肯定是第一个出银行队列结构图 String[] arr = {"A","B","C","D","E"}假如我们要把这个数组添加到..
2021-04-16 09:57:50 159
原创 Java数据结构———栈
前言本文将使用链表来实现栈结构,如果你对链表还不熟悉,建议先看我的上一篇文章LinkedList源码解析(手把手带你熟悉链表) 有对链表的讲解,本文将不再讲解链表什么是栈?栈是一种先进后出的数据结构,可以理解为一个容器,最先进入的数据在最底部,新数据会一层层累加在旧数据的顶部,而取数据的时候先从顶部开始取,所以取出来的数据肯定是最后添加的数据生活中的小例子: 每次洗完碗,把碗一个一个摞在一起,当下次使用的时候,拿的第一个碗肯定是最顶部的,也就是最后一个洗完的碗栈结构图 S..
2021-04-15 18:51:40 181
原创 LinkedList源码解析(手把手带你熟悉链表)
前言链表是常见的数据结构之一,但是很多同学只听说过链表,并不知道什么是链表,所以本文将会带领各位同学手写一个LinkedList,源码跟官方会有点不一样,不过思路是大概相同的,最后再带领大家读官方源码为了降低源码难度简化泛型代码,手写的LinkedList只能添加String类型数据什么是链表?可以理解为,把一些数据按照顺序排好,手拉手 每一个数据就是一个节点,所有节点连在一起,就组成了链表LinkedList的节点定义LinkedList是双链表,所以有左节点和右节点..
2021-03-30 19:03:18 160
原创 Android 50行代码实现自带点击效果的Button
前言Android中的Button虽然自带点击效果,但是一般我们都不会用默认的样式,以如下UI图为例:正常绘制流程绘制默认状态shape背景 shape_button_normal.xml绘制按下状态shape背景 shape_button_pressed.xml新建select文件,将两个状态关联 select_button.xml给Button设置背景 android:back...
2020-04-26 18:09:48 665
原创 Android自定义View之[可以走动的时钟]
效果图如下:绘制流程:绘制表盘绘制刻度绘制数字旋转数字绘制时分秒指针使用Handler定时刷新指针接下来一步一步实现:绘制表盘canvas.drawCircle(mWidth / 2, mHeight / 2, mHeight / 2 - dp2px(borderPadding), mPaint);绘制刻度 //绘制刻度,每次绘制完需...
2019-10-25 17:17:44 804
原创 小程序踩坑记(五)——— wx.navigateTo跳转首页无效
问题: 首页A—B,B—C,C—A(回首页无效)先来看首页,首页是由tabBar中三个页面组成再来看下首页的代码组成//只保留核心代码"tabBar": { ... "list": [ { "pagePath": "pages/home/home", "text": "小Q规划", ... }, ...
2019-05-09 11:09:24 1874
原创 小程序踩坑记(四)———真机无法显示图片,模拟器可以
解决方法检查图片路径有没有中文检查图片路径有没有空格 (我这是被这个坑的!!!)不能给view设置本地图片背景,可以使用base64或者image标签
2019-05-06 16:51:27 1212
原创 小程序踩坑记(三)———小程序网络请求简单封装
前言小程序网络请求很简单,但是每次这么写也很麻烦,所以就封装了一下核心代码代码很简单,其实就是请求成功后将数据返回到一个方法中function request(url, isJson = false, method, data, callBack) { wx.showLoading({ title: '加载中...', }) wx.request({ url: ...
2019-05-06 13:09:22 179
原创 小程序踩坑记(二)———wxml中切割字符串
遇到的问题: 在微信wxml中切割字符串无效(如下图)原因: wxml不支持解决办法:1. 目录中新建wxs文件 2. wxs中代码如下:/** * 参数1: 要截取的字符串 * 参数2: 开始截取的index * 参数3: 结束截取的index */var substring = function (val,start,end) { if (val.length ==...
2019-05-06 11:13:59 3256
原创 小程序踩坑记(一)———开篇
开篇很久一段时间没有写博客了,回想上一篇博客已经距离现在半年前了,写博客的好习惯大家一定要养成,我就是个反面教材QAQ.最近一段时间公司正在筹备一个小程序项目,公司没有人会写,正好最近Android没什么新功能要上线,就揽下这个活了,正好可以弥补前端布局以及js的不足,以后遇到小程序的坑或者一些好的技巧将会通过[小程序踩坑记]记录下来———人人都是梦想家...
2019-05-06 10:53:39 147
原创 Android 使用Gradle实现多渠道打包,同项目不同包名、Logo、名字、主题等
最近公司有个新需求,按照之前的项目换个名字,logo及部分资源文件重新打包个新的app实现思路1.拷贝一份项目更换名字、logo等 (效率低,麻烦 ) ❌2.多渠道打包 (方便,快捷) ✅实现方法项目下build.gradle>android下新以下代码android { ... ... //多渠道打包 productFlavors { //百...
2018-11-01 11:04:57 2663
原创 Kotlin入门———1.基础语法
第一个Kotlin程序fun main(args: Array&lt;String&gt;) { println("Hello World")}空参构造fun print() { //print为方法名 println("hello")}带参构造-无返回类型//a&amp;b: 参数名 Int: 参数类
2018-09-25 17:35:17 176
原创 Android ScrollView嵌套RecyclerView打开页面不是在最顶部的问题
出现问题的原因RecyclerView从ScrollView中夺取了焦点解决方法第一种方法: 禁止RecyclerView获取到焦点第二种方法: 使ScrollView主动获取到焦点第一种方法: 代码中直接禁止RecyclerView的焦点mRecyclerView.setFocusable(false);第二种方法: ScrollView获取焦点,可以直接在跟布...
2018-09-25 11:21:17 1780
原创 Android自定义方形验证码输入框
先来看UI给的效果图实现思路绘制多个TextView控件用来显示数字绘制隐藏EditText用来接收输入法内容(防止部分手机或输入法监听不到内容)将EditText的内容显示到TextView中代码实现自定义控件继承至LinearLayoutpublic class CodeEditView extends LinearLayout绘制多个Te...
2018-09-06 10:27:49 3316 1
原创 Android通过BaseActivity获取到当前启动的Activity名称
在BaseActivity的onCreate方法中: getClass().getSimpleName()
2018-03-29 10:34:27 3501
原创 Android 100+行实现本地跳一跳辅助(不需要连接电脑)
Android利用悬浮窗轻松实现微信跳一跳辅助实现思路透明悬浮窗手指滑动通过onTouch获取滑动的间距按比例计算出需要长按的时间使用shell命令模拟长按(需要ROOT权限)主要代码@Overridepublic boolean onTouch(View v, MotionEvent event) { switch (event.getActi
2018-01-05 12:57:52 710
原创 Java—public protected default private区别详解
跨包创建对象以及跨包继承当用以下权限修饰成员变量以及成员方法时 可以访问即表示可以访问成员变量以及成员方法public 直接创建对象可以访问,继承可以访问protected 直接创建对象不可以访问,继承可以访问default 直接创建对象不可以访问,继承不可以访问private 直接创建对象不可以访问,继承不可以访问总结:如果创建别的包的对象,成员变量以及成员方法必须为public否者将不能使
2017-12-25 11:44:21 318
原创 Java—static关键字详解
static也被称为静态,随着类的加载而加载,存在于静态区中,通常用于修饰成员变量和成员方法 - static的定义1.修饰成员变量public static int num = 0;2.修饰成员方法 public static void print(){ }static什么时候使用当对象中的成员变量是固定的,或者不需要每次创建对象时都去给这个成员变量开辟一块空间什么意思呢?举个栗子,现在有一个
2017-12-22 16:35:43 320
原创 Java—选择排序
选择排序算法假设当前要排序的数组如下:int[] arr = {3, 1, 7, 4, 6};选择排序就是从第一个元素开始和后面的每一个元素进行对比,先看图:从图中我们可以看出第一次排序是用第一个元素和后面每个元素进行比较,如果大于就交换位置下面先上代码: public static void main(String[] args) { int[] arr = {3, 1,
2017-12-13 09:20:38 263
原创 Android设计模式之—Builder模式
Builder模式也是很常用的一个模式,比如Android中的AlertDialog使用的就是Builder设计模式,下面举个例子来理解一下.1.首先我们先创建一个Person类class Persion { public String name; //姓名 public int age; //年龄 public int income; //收入 public Stri
2017-12-05 17:41:59 218
原创 Android设计模式之—单例模式
单利模式特别常用的模式之一,好处是保证一个类中只有一个实例,减少资源消耗.单利模式分为懒汉式和饿汉式.先来看懒汉式,所谓懒汉式,就是延迟加载,需要时才创建对象,先来看代码class Singleton { //私有静态实例 private static Singleton instance = null; //私有构造方法,防止被实例化 private Singlet
2017-12-05 16:59:40 216
原创 Android搜索附近蓝牙
1.首先添加蓝牙所需要的权限 <uses-permission android:name="android.permission.BLUETOOTH"/> <uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/> <uses-permission android:name="andro
2017-11-24 14:57:10 1566 2
原创 Android 微信支付的坑
这次公司项目中需要用到微信支付,由于我之前也是没做过微信支付,所以这次就来讲讲我遇到的坑(微信支付的开发文档写的真是…新手看完估计都无从下手)1.sendReq()方法调不起微信由于申请微信开发时填写的签名是正式签名,但是在我们直接运行时系统默认使用的时是dubug.keystore签名文件,所以可以尝试将app用正式签名文件签名后重新调用这个方法2.充值成功后接收不到回调这个必须保证充值回调的接口
2017-09-18 11:32:02 571
原创 Android 签名后安装失败(-103)
先说下我遇到的情况,前段时间把Android studio从2.2升级到了2.3 因为没有细看升级的日志,所以就遇到了今天的坑:签名后无法安装,Android studio2.3签名时多出来两个选项,两个一定要都勾选,切记!!!ok,成功解决问题! 不过小米6可以直接安装成功,目前还不知道原因
2017-06-27 10:45:26 15929 1
原创 Android7.0使用FileProvider安装apk
Android7.0安装文件的话默认会抛出FileUriExposedException
2017-06-26 11:28:34 4044
原创 Android打开系统相机 适配Android7.0
/** * 调用系统相机 */ public String openCamera(int requestCode) { String cameraPath = Environment.getExternalStorageDirectory().getPath() + "/" + context.getPackageName() + "/camera/";
2017-06-21 14:05:43 430
原创 Android 百度地图导航没有声音的解决方法
说说最近集成百度导航遇到的坑,不管怎么测试都是没有声音,解决方法:1.首先先保证百度TT语音播报后台成功注册了2.重点!!! 不要在手机上直接运行,打包签名后再安装到手机原因是TTS语音播报的后台注册时的MD5值是签名文件里面的,而直接运行时默认会使用android自带的debug签名文件
2017-06-09 09:45:50 6530
原创 Errors while building APK. You can find the errors in the 'Messages' view.
签名时遇到的问题,解决方法,在build.gradle中加入如下代码:android{ lintOptions { checkReleaseBuilds false abortOnError false }}
2017-05-19 17:05:44 1442
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人