- 博客(117)
- 资源 (8)
- 收藏
- 关注

原创 正确使用Kotlin动态代理
说到设计模式,想必很多老手,上来都会熟练的讲上几个,动态代理,想必会是其中之一,动态代理很多中高级Android程序员,都是得心应手,因为著名网络框架Retrofit,有使用该设计模式,但你真的知道如何在kotlin中使用动态代理吗?如果没用过,可能会踩坑。如果用过且熟练,则不建议阅读,可以省下时间。
2023-05-09 16:33:51
1581
2

原创 红黑树的时间复杂度分析
一、红黑树的基本属性。红黑树的每个结点,要么是黑色,要么是红色,不可能是黄色或其它颜色。根结点(root)一定是黑色,简称为黑头。所有红色结点不可以直接相邻。 也即是,如果一个结点为红色,那么,它的爸爸或儿子,一定就是黑色,不可是红色。符合,绿帽定律。所有空结点,都是黑色。所谓的空结点,就是当红黑树的某一个叶子结点下,没有其它结点,那么这个结点,就是空结点,用NIL 或 NULL 表示。...
2020-04-23 11:26:29
28405
12

原创 Java Skeletal Implementation/Abstract Interfaces(骨架实现/抽象接口)
注:skeletal implementation,下文,全部简称SI。一、接口与抽象类的优劣。接口,可以实现多继承,但抽象类不行。抽象类,可以有实现,但接口不行。我们先一步一步来,先举一个,用接口的例子,再通过分析例子,一步一步进行讲解。二、使用接口,规范相同行为。 假设,我们要做一个苹果自动贩卖机(自动贩卖机简称贩卖机)和葡萄贩卖机。那么,良好的代码设计,肯定不是一上来...
2018-07-03 20:26:01
881
2

原创 Android 内存优化策略
本篇博客,主要向你说明,以下两个问题:为什么要内存优化?如何进行内存优化(方法有哪些)?一、为什么要内存优化? 因为Android平台和Java语言本身的某些特性的缘故,在开发过程中,如果不注意这些特性。可能会导致内存消耗,比其它平台(IOS)和开发语言(C/C++)多得多。所以,我们需要最大化的去避免,额外的内存开销和泄露。所以,通过了解这些特性,并合理的组织你的代码,来减少A...
2018-07-02 19:15:31
1294

原创 Windows下配置MySQL(5.7.21)数据库
大好的周末,本该是打机、出游、睡觉的好时机。撸主,却在这里写博客… … 吊丝,注孤老。不管怎么样,希望,这篇文章,能帮到你。一、下载MySQL。 我下的是mysql-5.7.21-winx64。这是MySQL的下载地址:https://dev.mysql.com/downloads/mysql/ 。在里面找到对应你的系统和位数的版本下载即可。二、解压MySQL。 找一个位置,最好是磁盘...
2018-03-25 17:57:18
10821
2

原创 Android 如何运用MVP模式开发(以封装Login模块为例)
前言:本文将会,向你介绍如何在android开发中运用MVP模式,来解藕并提高代码的复用。现在,如果不采用个什么模式来开发,就像当年不染个五彩缤纷的杀玛特头发一样,显得与时代格格不入。虽然以前没有染发加入杀玛一族,导致追悔莫及。但是,这次得把握住机会,紧追时代潮流,加入MVP模式开发一族(MVP沙文主义:凡是不用MVP模式开发的,都是在耍流氓)。代码注释用英文写的,目的是练习英文。用的都是比较...
2018-03-01 15:01:51
1138

原创 对RxJava2理解的总结
前言: 如果你在看过诸多RxJava2相关的文章,仍然对RxJava2没有一个整体的认识的话,可以看一下这篇文章。全篇,以问答的形式,由简入繁,一步步带你认识RxJava2。如果你还没有学过RxJava2,那可以参考这篇 :RxJava 2.x 入门教程1、什么是RxJava2? 答:RxJava2是一个工具,也是一个库。2、什么是工具或是库? 答:工具,就是用来做事的。比如,剪刀可...
2018-02-28 17:59:45
2544

原创 Android 如何封装网络框架(以封装OkHttp为例)
前言: 现在,在网络方面,安卓主流是采用Retrofit + RxJava2的组合。但是,天天用别人封好的东西,总不是办法。就好像天天去大宝健,总不如找个漂亮的女朋友好(有人说,有漂亮的女友,谁还去大宝健。。那就太年轻了,妻不如妾,妾不如妓,妓不如偷,偷不如偷不着)。虽然自己水平有限,但做人如果没有理想,那与咸鱼有什么区别。所以,冒着被喷成狗的风险,我毅然决然的写下这篇博客。毕竟骂不死我的,只会...
2018-02-27 16:28:32
1732

原创 Android Room DataBase(一)
前言:众所周知,安卓原生的Sqlite数据库的操作不仅冗余麻烦,而且操作过程容易出问题。所以,后续github上出现了许多开源的封装了Sqlite的第三方library,来帮助你简化操作数据库,摆脱Sqlite的魔掌。比如,举世闻名的GreenDao。又比如,白痴化不需写Sql语句的Realm。又比如…. 。Anyway, 谷歌也注意到这个问题。所以,推出了Room DataBase,来解决这...
2018-02-22 14:20:10
8747

转载 platform-tools\adb.exe,start-server' failed -- run manually if necessary,adb启动失败,端口被占用
转载自:http://blog.sina.com.cn/s/blog_8fd5421d0101dnlg.html经常遇到 Please ensure that adb is correctly located at 'D:\java\sdk\platform-tools\adb.exe' and can be executed.遇到问题描述:运行android程序控制台
2016-05-11 11:55:08
18712
原创 【AMS】Android 8.0+ 绕开启动后台Service限制
【附源码修改实现】应客户要求,需要在开机时,拉起应用A。但因为开机时,同时被拉起的应用过多,导致Launcher在开机那一刻较为卡顿。为解决这一问题,采取了延迟拉起的做法。在开机后,延迟一定时间,由系统服务,拉起应用A。
2024-05-21 16:09:50
1472
原创 Android Studio Dolphin 带来全新的Logcat功能,赶紧来瞧一波!
Logcat,一直是安卓开发所不可或缺的功能之一。通过Locat,我们可以快速定位问题,协助我们分析问题,包括定位崩溃等。在谷歌新发布的Dolphin版本中,Logcat得到了质的提升,让我们一起来学习一下,有哪些新features,来帮助我们提高开发效率。如果你不喜欢默认的格式化排版,可以通过点击小红框处的按钮,选择模式,这个更接近旧版的格式。如果觉得这个也不满足你的要求,可以选择,来自定义排版。
2022-10-18 21:05:00
2438
1
原创 setBinding(new Binding([gradle: this]))报错
setBinding(new Binding([gradle: this]))报错
2022-07-30 20:50:13
1735
2
原创 dimen目录匹配规则
竖屏状态:屏幕宽度/屏幕密度横屏状态:屏幕高度/屏幕密度调试:可通过adb shell size查看分辨率、adb shell density xxx(160/240/480等)修改密度、adb shell density reset 重置密度。比如,手机情况下:是否横屏:是分辨率:1280(宽) * 720(高)密度:1.5(240/160)dp = 720/1.5=480则匹配出来的目录为:values-sw480dp...
2022-04-19 19:47:04
234
原创 adb wifi 连接设备
查看设备的wifi地址,比如:192.168.1.102使用adb命令连接:adb connect 192.168.1.102,连接成功。如果连接失败,报错:由于目标计算机积极拒绝,无法连接。(10061),则先执行:adb tcpip 5555。 将adb的端口指定为5555。【这里的端口号,以具体设备为准】再重新执行adb connect。...
2022-04-18 17:41:35
2845
原创 android studio bumblebee 创建flutter module
android studio bumblebee新版的暂不支持通过IDE来自动添加fluttermodule,但我们可以手动添加。假设需要添加flutter module的项目位于 some/path/MyApp,则通过cmd,执行以下命令,即可,前提是要确保你的flutter开发环境是配置正确的。 cd some/path/ flutter create -t module --org com.example my_flutter...
2022-03-08 10:40:20
3666
原创 Jvm原理快速复习篇
一、什么是JVM?JVM的全称是Java virtual machine,它是属于JRE(Java运行环境)的一部分。我们平时运行一个java应用程序,就是由JVM来负责管理的,每一个java应用程序都会有属于自己的JVM实例。二、JVM的组成。ClassLoader。JVM memory。Execute Engineer。二、JVM的作用。加载class文件,将class加载到JVM中。【ClassLoader】内存管理,分配内存空间,内存空间分为堆区、栈区、方法区、本地方法栈、程序
2022-02-23 16:52:10
560
原创 热修复快速复习篇
热修复原理:资源修复。通过反射的方式,创建新的AssertManager替换旧的AssertManager。【Instant Run】代码修复。基于分包原理,dvm/art在加载主dex后,当需要查找某个类时,会依次从dex包数组里面查找, 我们只要创建个新的修复类,并打包成dex放在dex数组的前头,这样虚拟机加载到该类后就会直接return掉,不会再去加载旧的有bug的类。【】动态链接修复。1. 在Native层,加载so时,跟代码替换的场景一样,优先加载。2. 代码替换System.load加
2022-02-22 15:23:07
1908
原创 Windows下,在AndoridStudio的Terminal窗口查看当前App的activity的名字和全路径
命令分2步:1. adb shell,进入shell。2. dumpsys activity top | grep ACTIVITY打印结果如下: ACTIVITY com.tencent.mm/.ui.LauncherUI ** pid=22 ACTIVITY com.tencent.mm/.plugin.appbrand.ui.AppBrandUI1 ** pid=22 ACTIVITY me.ele/.Launcher ** pid=22 ACTIVITY com.huawe
2022-01-04 11:53:01
1198
原创 多线程 快速复习篇。
对象锁,即指,同一个对象,当有多个线程【1对象 + 多线程】,都要执行被synchronized 修饰的方法或是包裹的代码块时。同一时间,只有一个线程可以进入。但如果对于多个线程,所个线程都有自己的对象【多对象 + 多线程】,则同一时间,所有线程都可以进入。类锁,不管是【1对象 + 多线程】的情况,还是,【多对象 + 多线程】的情况,同一时间,也只能有一个线程对其中的一个对象进行操作。对象锁(方法锁)。public synchronized void test(); // 方法锁,也即时对象锁。
2021-11-04 17:27:49
193
原创 数据结构/算法 快速复习篇
一、常见的数据结构.栈。先进后出,如同一口井。队列。先进先出,如同一条2头通的管道。链表。以单个或多个结点,连接在一起的方式实现。分为单链表和双链表。区别在于,单链表是每一个结点只链结下一个结点。而双链表,既连接前一个结点,也连接下一个结点。双连接更利于双向编辑,但更加占内存。具体用哪个,视使用场景来看。数组。以顺序排列的方式,依次存放数据。查找和存取快,在已知下标的情况下,存取的时间复杂度为O(1)。Map。以键值对的方式,一一对应存在。HashMap。基于Map的原理,内部是以数组+链表的
2021-11-04 16:19:46
530
原创 Okhttp 快速复习上手篇
我们先从大的角度切入,对Okhttp主要需要了解以下几个方面的知识:一、 整体框架是什么?二、 优点是什么,如何实现这些优点?一、整体框架是什么?我们先看一张Okhttp的架构图从这张图可以看出,整个Okhttp可以大致拆为:Okhttp的构建,Builder,运用了Builder模式。请求的创建,Request。请求的分发,Dispatcher。拦截器的实现,Intercepter,运用了责任链模式。网络请求的回调,Response。整个框架的核心,在于拦截器的实现。其中,对请
2021-11-04 14:23:00
253
原创 Android 事件分发快速复习篇
事件分发依据自上而下,层层分发的原则。最顶层,最先接收到Touch事件的View是decorView,可以通过window.getDecorView()获取。ViewGroup在进行层层分发的过程中,会依次调用以下三个方法: dispatchTouchEvent->onInterceptTouchEvent->onTouchEvent。如果onInterceptTouchEvent拦截了事件,则会直接调用onTouchEvent。如果onInterceptTouchEvent没有拦截,则会.
2021-10-29 17:41:55
1377
原创 App启动优化调研及方案
一、 启动优化的作用。启动时间过久,会影响新老用户体验。新用户。降低新用户的留存率和应用评分。老用户。对老用户的使用造成烦扰,用户使用频率越高,影响程度越重。二、商城App与主流/竞品App的启动对比。1、测试机型:荣耀v20,无后台应用。(不同机型与使用状况,会影响启动时间)2、测试方式:Logcat过滤Displayed值,多次打开取平均值3. 启动耗时对比:测试总结:一手App在启动时间上,与竞品批批网不相上下。但比竞品蘑菇街的启动时间大了1倍有余。比主流App,微信、饿了
2021-10-26 13:38:24
352
原创 Failed to find Build Tools revision 25.0.3
打开SDK Manager,下载对应的SDK版本(25.0.3)后,重新编译一下项目就行了。
2021-09-22 17:38:55
1177
原创 Activity生命周期 快速复习篇
一、 基本的生命周期流程onCreate() -> onStart() -> onResume() -> onPause()-> onStop-> onDestroy()二、启动FirstActivity(A),然后点击跳转到SecondActivity(B)所走的生命周期流程onCreate(A)->onStart(A)->onResume(A)-onPause(A)->onCreate(B)->onStart(B)->onResume(
2021-09-02 10:42:12
208
原创 Kotlin高级特性之标准函数
序言使用Kotlin时,我们经常会用到标准库中的几个方法,也很容易弄混在什么地方,应该调用哪个方法比较合适。在这里,我们把功能和组合的方式列出来,方便巩固记忆。一、基本功能let: 1,以闭包的返回值为返回值。2,判空处理。also: 1,以自身为返回值。2,判空处理。with: 1,省去类名调用。run: 1,省去类名调用。2,以闭包的返回值为返回值apply: 1,省去类名调用。2,以自身返回值为返回值。二、简记公式let、also、with,单独记忆。run = with +
2021-08-31 14:58:36
303
原创 Android 绘制优化
序言在开发app时,我们经常会提及一个词,卡顿。因为肉眼可接受的最低流畅度,为60帧/s。所以,当1秒内无法绘制到足够的帧数时,从肉眼看,就会表现为卡顿。因此,要确保每秒能够绘制到足够的帧数,平均地讲,我们需要确保每帧的绘制时间不高于16.6ms(1s % 60 == 1000ms % 60 ~= 16.6ms)。如何尽量确保每帧的绘制时间低于这个值。我们需要先知道,究竟是什么在耗时,这样才能对症下药,而这也是我们这篇文章所要探讨的。一、GPU渲染分析。开启渲染监控。开发者模式->监控->
2021-07-22 18:32:16
288
1
原创 Kotlin 各版本新特性(1.4+)
Kotlin 各版本新特性一、1.4.01. 支持SAM语法2. 带默认值的多参方法的调用优化。一、1.4.01. 支持SAM语法SAM 即 Single Abstract Method, 自打 Java 8起,lambda语法,使得java语法更加简洁。SAM就是其中的亮点之一。我们先来看一下,java的实现方式对比: interface SAM{ void test(int i);}public class Test { public static void main(
2021-05-12 16:36:28
1148
1
原创 Android Studio 编译报错 Java.lang.NoClassDefFoundError: javax/xml/bind/JAXBException
解决这个问题,需要了解以下知识点:一、不同的JDK。做为安卓开发程序员,我们一般会给电脑安装java,但是Android Studio也自带了java(OpenJdk)。这样,电脑上就会有两个版本的java。二、不同版本的Android Studio。Android Studio 4.2.0以下的版本,自带的java是1.8.0。Android Studio 4.2.0以上的版本,自带的java是11.0.8。三、问题分析。1、如果你的AS低于4.2.0,出现这种情况的话。点击Android
2021-05-06 19:12:34
3541
2
原创 应用报病毒A.gray.Falseloan。
如果有用360加固,在基础设置里面,把增强服务都去掉,尤其是里面的崩溃日志上报服务。即可解决。
2021-04-07 10:41:05
7100
1
原创 Android根Activity启动流程简述
序言从我们点击屏幕上的应用icon,到该应用为你展示第一个可视界面,这个过程中,Android系统究竟做了什么操作?又涉及到哪些进程整个过程是相对复杂的,我们不可能花时间去琢磨透每一行源码的作用,这样会让我们迷失在源码的海洋之中。相反,我们应该重点去关注这个过程,从大的层面,去掌握这个过程。这样,进可以深入源码之洋。退可以知此原理。我们大致的将这个过程,划分为三个主要步骤:1. 从Launcher到AMS。当我们点击屏幕上的应用icon时,Laucher发送启动应用的请求给AMS,因为Launch
2021-01-30 14:47:17
2373
3
kotlin-compiler-embeddable-1.3.61.jar
2020-07-28
创建dimens工具
2016-06-01
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人