- 博客(73)
- 收藏
- 关注
原创 Android 线程通信 —— Handler 使用
Android 线程通信 —— Handler 使用Android 应用是一个多线程应用,Android 有一个主线程,在没有特定指明线程的前提下,你执行的代码都是在 Android 主线程中运行。一般来说 Android 的 View 绘制是在主线程中完成的,所以如果我们在主线程中进行耗时操作时,线程无响应就会导致 UI 绘制等其它用户所看到的东西和执行的操作卡住,给用户带来不好的体验。所以 Android 中规定了 ANR(Application Not Responding:应用无响应)。ANR
2020-09-08 17:16:57
589
原创 AndroidX 迁移步骤,一篇就够了
AndroidX 迁移2018 年 I/O 大会后,Google 宣布将 Support Lib 重构为 AndroidX 的计划,随后便在 Support Lib 28 上进行了重构。然而因为后续不会在 Support Lib 上修复 bug 或者发布新功能,而且 Support Lib 和 AndroidX Lib 在项目中会互相冲突,所以我们不可避免的要进行 AndroidX 迁移。此篇文章就是笔者进行 AndroidX 迁移时的步骤和踩过的坑,希望可以帮到你。新建分支或者备份项目因为 Andr
2020-07-24 18:18:24
3759
原创 常问的几个基础排序,要不再复习一下?
Github 地址排序,不管是日常开发还是面试中,都会被光顾,虽然现在 jdk 的集合中提供了排序的方法,但是我们也得去熟悉一些基础的排序算法,这里笔者给大家分享五个常问的基础排序,冒泡、选择、插入、希尔、快排。冒泡排序冒泡排序,顾名思义就是排序元素时像冒泡一样,把最大或者最小慢慢比较到数组尾部,实现排序的方法。具体就是,如果有一个长度为 n 的数组 num,将 num[0] 与 num[1] 比较,如果 num[0] > num[1] ,则交换位置,反之则不交换。再比较 num[1] 和 nu
2020-06-02 22:59:42
295
原创 关于二叉树的遍历,你要的都在这
关于二叉树的遍历,你要的都在这树的概括树什么是树,树是数据结构中的一个基础类型,是包含n(n>=0)个结点的有穷集,由这 n 个节点组成一个具有层次关系的集合,因为其可视化形状像一颗倒立的树,所以被称为树。树的节点可以分为父节点和子节点,一个父节点可以对应 m (m>=0) 个子节点,子节点只有一个父节点,最顶部的节点被称为根节点或者树根。一个结点含有的子结点的个数称为该结点的度,度为 0 的称为叶子节点或终端节点。除了根结点外,每个子结点可以分为多个不相交的子树,所以也可以说树是由根结点
2020-05-27 21:58:55
659
原创 使用 Fresco 展示 Gif,控制播放次数,拿着就能用
我们在开发中经常会做一些 Gif 展示,而一些开源的图片框架如 Glide、Fresco、GifImageView 也能够展示 Gif,GifImageView 可以直接设置播放次数,而 Fresco 好像并没有设置播放次数的,就需要我们自己来处理。 首先,要使用 Fresco 就得先依赖,注意两个版本得一致:implementation 'com.facebook.fresco:fresco:1.5.0'implementation 'com.facebook.fresco:animat...
2020-05-20 18:21:06
1613
原创 如何防止系统弹窗被多次调用
在日常的开发中,我们经常会使用到 Dialog、PopupWindow、Toast 等,为了防止重复点击多次弹出,我们可以使用单例、或者定时器,配合 isShow() 的方法能很好的解决这个问题。那么系统的弹窗呢?比如 Intent 分享,我们没有弹窗打开关闭的回调,也不能做弹窗的单例,那我们要怎么解决这个问题呢?笔者介绍两种方式。1. 使用定时器,设置开关private bo...
2020-03-10 15:10:04
1704
原创 支持左滑菜单栏的 RecyclerView
iOS 有一个自己的交互方式,左滑菜单栏的数据列表,手机 QQ 也是这样的交互方式,但是 Android 自身却没有这样的控件,需要我们自己去封装,笔者这里封装了一个简易版的,需要自取。先放效果图优点轻量:该库比较轻量,不会因为引库导致应用庞杂简单:使用简单,Activity 内只需要几行代码实现依赖克隆本项目,然后在你的 IDE 中依赖本项目的 slide_recyclervi...
2019-12-17 11:51:52
494
1
原创 Android 获取 Notification 权限
本来需要拿一下 Notification 的权限,看了一下网上的博客,基本上都是使用反射,代码较长,而且试了一下,好像拿到的结果也不是很准确,其实可以直接使用 Google 提供的方法:NotificationManagerCompat.from(this).areNotificationsEnabled();一行代码拿到权限,但是需要注意的是,看了源码后发现 4.4 以下是拿不到权...
2019-12-09 10:59:15
1140
原创 HashSet 源码解析
HashSet 源码解读原地址:GiHubHashSet 也是 Java 集合中一个相对常用的,其内部实现比较简单,而且其内部是相当于维护了一个 HashMap,可以先看一下 HashMap 源码解读。与 HashMap 维护的 key-value 两个成员不同的是,HashSet 只相当于维护了一个成员 E,虽然内部使用的 HashMap,但是内部维护的 HashMap 的 value 是一...
2019-10-29 18:32:43
236
原创 ArrayList 源码分析(基于 JDK 1.8)
ArrayList 源码分析ArrayList 是 Java 中比较常用的集合之一。它实现了 List, RandomAccess, Cloneable, java.io.Serializable 这四个接口,List 接口是为了让 ArrayList 去实现 List 的各种方法,实现 RandomAccess 是为了让 ArrayList 支持快速快速随机访问,实现 Cloneable 是为...
2019-09-28 23:40:20
324
原创 Android 保存图片(包括网络图片)到单独的相册
我们经常会遇到将图片保存到本地的操作,而且有时候我们需要将图片保存到一个单独的相册,比如微信保存的图片是放到微信相册,微博放到了微博相册。 我们保存的图片可能有很多的类型,比如 Bitmap、网络图片、字节数组、资源 ID 等,根据不同的类型我们需要做不同的处理。我们先看看怎么把 Bitmap 保存到本地相册:public static void saveImageToGall...
2019-09-20 17:31:34
1383
原创 Git Couldn't stash Unable to create index.lock File exists.
今天在使用 Git ,当我 pull 时,失败了,日志为:Couldn't save uncommitted changes. Tried to save uncommitted changes in stash before Update, but failed with an error. Couldn't stash file://**: Unable t...
2019-09-17 10:19:34
1025
1
原创 HashMap 源码中高闪代码
HashMap 源码中高闪代码原地址:GithubHashMap 源码中有很多的东西是值得我们去认真琢磨的,这里笔者就分享其中的一些超级棒的地方,当然还有更多的地方值得大家去努力探寻。2 的整数次幂与 (n-1) & hash在笔者的 HashMap 源码解析 中说到了,HashMap 中规定了,数组 table 的容量以及扩容值都必须为 2 的整数次幂。在 HashMap 中,元...
2019-09-04 23:28:25
200
原创 HashMap 源码分享(构造方法、put、get、扩容)
HashMap 源码解读说到 HashMap,大家一定都不会陌生,不管是我们平时使用,或者是面试的时候,都会遇到它,了解其源码还是相当重要的。HashMap 其实维护的的数据结构是 Node<K,V> 的数组加链表(下面会说到为什么),也是说的维护的 Hash 桶,什么意思呢?按照笔者个人理解就是说 HashMap 中保存数据的是一个叫 table 的数组,HashMap 有新数...
2019-09-01 23:37:15
299
翻译 获取 Facebook keyHash
try { PackageInfo info = getPackageManager().getPackageInfo( "你的包名", PackageManager.GET_SIGNATURES); for (Signature signature : info.signatures) { ...
2019-08-01 15:01:46
328
原创 Android 集成 Facebook 分享常见问题
Facebook 作为世界上用户量最大的应用之一,很多时候我们可能会将自己应用的数据分享到 facebook上,那么我们就需要集成其 SDK,我们可以直接去集成 Facebook 官方的 SDK,也可以使用很多第三方 SDK ,包括友盟、Mob 等等,他们都是讲 Facebook、微信等官方的 SDK 再进行了一些封装。 笔者在此就不对如何使用这些 SDK 做介绍了,网上有着很多的教程...
2019-07-16 17:46:58
4392
3
原创 AS 不同分支的 Module 数量不同,导致切换分支后 module 不显示的问题
在 AS 中 使用 git 工具进行不同分支的开发,比如不同分支要使用的 module 数量不同而导致切换分支后 module 不显示,而且 clean 和 rebuild 也不能解决问题,我们可以重启 AS。...
2019-04-03 13:52:05
1171
11
原创 Android Studio 上新建了 AIDL 文件,使用不了(找不到)怎么办
进程间通信,我们可以使用 AIDL,但是当我们在 Android Studio 上面新建了 AIDL 文件,却发现 new MyAidl.Stub() 找不到,这个使用要怎么办呢? 编译一下,马上解决!!!...
2018-10-11 20:04:40
3033
3
原创 TortoiseGit 的 Git Commit 和 Push 时,build 编译文件自动出现,也提交上去了
当我们使用 git 工具来进行合作开发时,把代码提交到远程库时是不希望将 build 文件也提交上去的,那么怎么解决这个办法呢? 打开你 git 项目的根目录,就是有 .git 那个文件夹,修改 .gitignore 文件:我们不想要 tortoiseGit 来获取哪些文件的改变就只要在里面加入想忽视的路径:如我们加入了:/SchoolProject/build那么...
2018-09-26 11:57:36
3731
原创 Program type already present: com.alibaba.android.arouter.routes.ARouter$$Group$$ImBusiness
今天在写东西的时候报了一个错误,这个是使用 alibaba 的路由框架 ARouter,进行模块间通信报才错。 Program type already present: com.alibaba.android.arouter.routes.ARouter$$Group$$ImBusiness 意思是 Arouter 配置的路径的组路径已经存在了,举一个栗子: 我们在中配置模...
2018-09-15 14:27:01
3106
原创 Android 存储——文件存储
Android 数据存储的方式有很多种,其中文件存储就是我们经常会使用的一种方式,在了解文件存储之前,我们先来了解一下我们手机的存储空间。 手机的存储空间可以分为三个部分:系统分区、程序分区、公共存储空间。 系统分区:就是手机操作系统所占用的分区,是内存空间目录下的 system 目录,其中系统自带的 apk 就在 system/app 目录下,需要注意的是,手机普通用户对于 ...
2018-07-10 17:08:27
661
原创 Android 模块通信—— EventBus
EventBus 是 Android 的一个基于发布/订阅模式的轻量级框架,用于 Android 解耦的事件传递,开源地址。 这是官方地址的一个说明图: 可以看到,它是通过发布者的 post() 来发送时间,订阅者的 onEvent() 来响应事件,我们来看看怎么使用 EventBus: 第一步当然是导入它的依赖库:compile 'org.greenrobot:eventb...
2018-07-09 18:06:34
2492
1
原创 Android 数据储存——SharedPreferences
Android 数据储存的方式有很多种,SharedPreferences 是其中一个较为轻量级的方式,它是将键值对储存在 xml 文件中,获得它的实例有两种方式:// 方式一 SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this);// 方式二,传入...
2018-07-05 16:15:19
583
原创 Android 通知栏——Notification
在 Android 开发中,通知栏是一个比较常见的功能,我们来看看如何来实现一些简单的通知栏。 实现通知栏主要由两个类:Notification 和 NotificationManager,但是由于 API 版本的不同导致实现方式会有所不同,所以 Google 提供了 v4 包里面的 NotificationCompat 和 NotificationManagerCompat 来实现...
2018-07-04 20:34:43
3436
原创 Android 属性动画——插值器、估值器、关键帧
动画中除了一些简单和组合的动画效果,还有很多其它的小功能,比如说这里的插值器、估值器、关键帧。插值器 对 Android 动画来说,不管是视图动画还是属性动画,都是有插值器的,那什么是插值器呢?就是控制动画随着时间轴的变化而变换的效果。 而 Android 动画也自带了一些插值器,如:加速插值器、减速插值器、循环插值器等等,接下来我们看看 Android 动画自带的插值器,我们...
2018-07-03 13:59:53
1446
原创 Android 动画——属性动画
从 Android 3.0 就推出了属性动画,在以前使用的是视图动画,那么属性动画的优势在哪呢?都知道,视图动画对于一个 View 的操作仅仅只是一个表象的操作,就是说,视图动画中,仅仅只是对它视图的操作,而它真实的坐标和属性并没有发生变化,那么属性动画就是对一个 View 或者非 View 属性的操作,这一强大功能让它解决了视图动画的缺陷。 和视图动画一样的是,属性动画(Anima...
2018-07-02 17:56:59
4853
原创 Android 自定义 View——手势密码
Android 自定义 View 当然是十分重要的,笔者这两天写了一个自定义 View 的手势密码,和大家分享分享: 首先,我们来创建一个表示点的类,Point.java:public class Point { // 点的三种状态 public static final int POINT_STATUS_NORMAL = 0; public static ...
2018-06-29 15:58:16
634
原创 Android Fragment 使用
Fragment 是 android 中比 Activity 更加轻量级的视图与逻辑结合的碎片, 我们可以在应用中使用,更方便的达到一些业务需求。 使用 Fragment,我们要创建一个类继承自 Fragment,一般我们选择继承 v4 包下面的 Fragment,兼容更好: public class TestFragment extends Fragment { priv...
2018-06-29 11:59:44
319
原创 Android 动画——视图动画(补间动画+帧动画)
Android 动画主要可以分为两种,一种就是视图动画,一种就是属性动画,这里我们先了解一下视图动画。而视图动画也分为 Tween(补间)动画和 Frame(帧)动画。补间动画 补间动画就是一个 View 从开始状态到结束状态变化的过程,补间动画有四种基本变化:渐变、平移、缩放、旋转,这四种基本动画效果都可以通过 xml 和代码两种方式来实现。补间动画如果要使用 xml 方法,就需要...
2018-06-29 11:02:15
572
原创 TortoiseGit 右键没有 gitClone 和 Setting
今天安装 TortoiseGit 的时候,不知道是不是因为 win10 的原因,右键没有 gitClone,也没有 Setting: 这个时候我们就使用 Shift+右键就能解决: 上网搜了一下改注册表,我这个懒人感觉很麻烦就放弃了,这个方法解决起来很便捷。...
2018-06-19 10:34:40
22769
9
原创 Fragment 中 commit already called
每一个实例化后的 FragmentTransaction 的事物只能被提交一次,我开始时是定义了一个全局的 FragmentTransaction,然后就只在 onCreate() 方法中实例化了一次,但是我设置点击事件切换 fragment 时,会导致二次 commit,所以会报错。@Override public void onClick(View view) { ...
2018-06-17 15:28:28
6110
原创 Android 开发规范(阿里巴巴 Android 开发手册)
笔者是一名学生,其实对于学生和准备踏入这行领域的小伙伴来说,对于从事 Android 开发,有一个好的开发规范,能够更加高效的进行合作开发,也能在别人接受自己的任务和自己接手别人的任务时花费更少的时间,让代码的可读性更高,所以,对于一个开发者来说,规范的编写自己的代码特别重要。笔者是一名 Android 的学者,所以这里推荐 Android 的开发规范,就是阿里巴巴 Android 开发手...
2018-06-13 20:40:37
1100
原创 Kotlin 学习——嵌套类和内部类
在 Kotlin 中,和 Java 一样,类也是可以嵌套在其它类中:class Demo{ val i = 10 class InDemo{ fun answer(){ val demo = Demo() println(demo.i) } }} fun main(args: ...
2018-06-03 19:01:20
485
原创 Kotlin 学习——数据类
在 Kotlin 中,有一个 data 关键字,来标记类,这种类一般只用来保存数据,但是数据类必须满足类以下条件: 1. 主构造函数至少有一个参数 2. 主构造函数的参数必须使用 var 或者 val 标记 3. 数据类不能使抽象、开放、密封或者内部的 4. (1.1以前)数据类只能实现接口data class Demo1(val name:String,val a...
2018-06-03 16:40:06
394
原创 Kotlin 学习——可见性修饰符
在 Kotlin 中,对于类、对象、接口、构造函数、方法、属性和属性的 setter 都可以使用可见性修饰符来标记(属性的 getter 与属性是相同的可见性)。 在 Kotlin 中有四种可见修饰符:private、protected、internal 和 public。相信大家有过一定编程基础都知道 private、protected 和 public 一般来说意味着什么,那么 ...
2018-06-02 19:20:24
756
原创 Kotlin 学习——接口
Kotlin 的接口和 Java 8 类似,既包含抽象方法的说明,也包含实现,只是不能保存状态,它的属性必须声明为抽象或提供访问器实现:interface Demo{ fun show() fun look(){ println("LOOK") }}class Child:Demo{ override fun show() { ...
2018-06-02 15:52:03
365
原创 Kotlin 学习——属性和字段
前面已经说过,Kotlin 的属性可以使用 val 或者 var 关键字标识的,val 声明属性是不可变的,只能读,而 var 是可变的,允许读和改变。而且在 Kotlin 中调用属性只需要向 Java 中的一样,使用实例调用即可:class Demo{ val isAlive = true var name:String = "" var age:Int = 0...
2018-06-01 18:59:26
444
原创 Java 使用 Socket、RxJava、Gson 传输解析 json
项目源码地址:地址 这几天和做嵌入式的学长做了一个小项目,学长使用 Socket 来传输包含了各个传感器信息和摄像头图片的 json 字符串,我这边使用 Android 客户端显示和加载信息和图片。 这里使用的 Base64 编码来对图片进行编码,每一张图片都比较大,我们想实现高频率传输图片做成视频的效果。使用 GsonFormat 创建 Bean 类: 先导入 Gson...
2018-05-31 18:46:38
1498
2
原创 Kotlin 学习——类和继承
在 Kotlin 中,类使用 class 关键字来声明,类声明一般由类名、类头(指定了类型的参数、主构造方法)以及使用 {} 包起来的类体,类体可为空:
2018-05-30 20:41:13
447
原创 Kotlin 学习——返回和跳转(break、continue、return)
Kotlin 的跳转表达式有三种:return、break、continue return:默认从直接包围它的函数或者匿名函数返回 break:终止最直接包围它的循环 continue:继续下一次直接包围它的循环 在 Kotlin 中任何表达式都可以使用标签(label)来标记,使用方法为在代码块前加上标签符后跟 @ 符号,如 flag@、abc@ 等等,标签符由自...
2018-05-27 11:00:22
3290
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人