- 博客(35)
- 资源 (4)
- 收藏
- 关注
原创 高级UI 之 自定义View
自定义View的生命周期:自定义View的基本方法 自定义View的最基本的三个方法分别是: onMeasure()、onLayout()、onDraw(); View在Activity中显示出来,要经 历测量、布局和绘制三个步骤,分别对应三个动作:measure、layout和draw。 测量:onMeasure()决定View的大小; 布局:onLayout()决定View在ViewGroup中的位置; 绘制:onDraw()决定绘制这个View。 自定义控件分类.
2021-10-08 23:47:17
158
原创 Json学习笔记
JSON 定义 JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。作用: 数据标记,存储,传输特点:1. 读写速度快 2. 解析简单 3. 轻量级 4. 独立于语言,平台 5. 具有自我描叙性 使用 Gson需要导包:implementation 'com.google.code.gson:gson:2.8.4'Gson基础使用案例一 Gson gson = new ...
2021-09-05 23:32:02
5181
原创 序列化的过程
序列化:将数据结构或对象转换成二进制的过程。序列化的用途: 网络上,跨进程序列化方案:json xml protobuf serializable(java) percelable(Android独有)....持久化:把数据结构或对象存储起来 硬盘如何选择合理的序列化方案。Serializable学习:public interface Serializable { } 里面没有任何方法,就是一个标志。public interface Externalizable ex
2021-09-04 07:18:29
395
原创 Gradle学习笔记
1. 环境配置1.安装Intellij IEDA开发工具 https://www.jetbrains.com/idea/download/ 2.下载groovySDK开发工具 https://groovy.apache.org/download.html 3.配置环境变量 添加GROOVY_HOME变量 值:机器上的路径\apache-groovy-sdk-3.0.3\groovy-3.0.3 PATH中加入 %GROOVY_HOME%\bin 4.较
2021-08-27 23:41:25
1753
原创 阻塞队列和线程池原理
1. 阻塞队列的两种形式1. 空的队列里面拿元素 2.满的队列里面塞元素add remove 不阻塞但是会抛异常offer poll -- 不阻塞但是会抛异常take put --- 阻塞
2021-08-20 07:49:26
135
原创 线程并发编程
1. 有几种新启线程的方式?答案只有两种。我们来看看Thread的构造方法的形式,如下:分析:方式一:查看Thread的构造函数一类型如下:class Thread implements Runnable {} // 线程Thread实现了接口,即里面肯定自己已经实现run方法。public Thread() { init(null, null, "Thread-" + nextThreadNum(), 0); //第二个参数Runnale对象传入的为空}Thread..
2021-08-18 23:42:07
106
原创 Android 动态代理
当一个实例出现多个接口的时候,使用静态代理就不实用了。就要选择动态代理。可以构造Invacation的构造函数,来用于invoke函数的反射使用。invoke真正被调用的形式如下:
2021-08-18 22:24:06
237
原创 Android注解的使用
案例一:在app的build.gradle中添加依赖:dependencies { annotationProcessor project(':compiler') //引用compiler 模块}在compiler java包中新建目录:resources\META-INF\services\javax.annotation.processing.Processor这个文件里面存的是将要去处理的注解器的包名和类名例如com.android.compiler....
2021-08-18 21:29:00
106
原创 Kotlin学习笔记
这是一门静态语言,在编译期就决定了类型。一,基本语法var 用来修改可以改变的变量。var name : String = "fw123"; //类型自推导 其中“String” “;” 都是灰色,表示可以省略掉。val 用来修饰常量 相当于java中的 const。val info = 123 //类型自推导二:函数 kotlin的函数可以写在类的任何地方。包括类的外面。函数的返回值 Unit == void字符串模板 $var name = "f...
2021-08-04 23:36:39
165
1
原创 Android线程池
android线程池的使用案例public class ThreadPoolManager { private ExecutorService mExecutorService; private static ThreadPoolManager mThreadPoolManager; public static ThreadPoolManager getInstance() { if (mThreadPoolManager == null) {
2021-06-17 06:28:30
327
原创 应用出现内存泄漏处理方式
内存泄漏的处理方式获取实时内存泄漏的命令:adb shell dumpsys meminfo 包名导出实时的机器hprof文件的命令:adb shell am dumpheap 包名(或者pid) /data/local/tmp/test.hprof1. 解决思路是:在应用onResume的时候,在子线程中循环一个小时判断一次,如果当前的内存大于某一个值例如800M的时候,就将hprof导出来生成以后放到手机里面,Debug.dumpHprofData(fileName); 使用这个来导出hprof
2021-04-07 22:05:56
368
原创 service_manager 的注册与获取
servicemanagerservice_manager 是native层的,它的Hander是为0的。它也是一个服务。下面是下init.rc中启动入口servicemanager :service servicemanager /system/bin/servicemanager class core user system group system critical onrestart restart healthd onrestart resta
2020-10-18 23:41:52
233
原创 Binder的JNI调用
JANI的注册Zygote的启动流程service zygote /system/bin/app_process -Xzygote /system/bin --zygote --start-system-server class main socket zygote stream 660 root system onrestart write /sys/android_power/request_state wake onrestart write /sys/power/
2020-10-17 23:27:16
340
原创 Binder学习笔记
Binder是什么?进程间通信机制也是一个驱动Binder.java 它实现了Ibinder(只要实现了Ibinder 接口 就具备了跨进程通讯的能力) —这个是为什么昵?多进程的原因为了 占用更大的内存空间, 每个进程拥有一个虚拟机,实现风险隔离,,每个进程相当一个单独的APP,将一个比较危险的动作放到单独的进程中,这样就算一个进程挂掉了 也不影响应用。Linux 进程间通讯的方式管道 信号量 文件管理 共享内存 soekcetBinder 优点:1.拷贝一次。2.
2020-09-18 23:35:37
136
原创 Handler 源码笔记
Handler所有的思想设计都是源于生活高于生活。大概知识点: 源码epoll 设计思路 设计模式 异步消息 同步消息 消息屏障 IntentServer管理机制: 消息管理所有的消息所有的代码都在handler中运行的。MassegeQuaua 是变量 是共享内存的...
2020-09-18 00:59:19
128
原创 Java多线程编程
Java多线程一个进程最多可以创建1000个线程,开一个线程大概要消耗1M的内存,超过这个线程数字将会出现线程泄漏。时间片轮转机制
2020-08-11 00:18:01
113
原创 Android内存泄漏分析
内存泄漏分析找到第一次内存泄漏日志点使用MAT工具找到问题点。monkey或者什么样的测试,使用脚本每隔一段时间固定抓取一次.hprofwen文件,使用MAT工具查看,只要内存由于他在稳定的增长,不需要完全内存泄漏复现,基本就可以认定这个它造成的内存泄漏。下面是关于MAT工具的使用说明:...
2020-07-27 23:44:50
107
原创 Java 泛型
Java泛型1. 什么是泛型?是JDK5引起的新特性,泛型提供了编译时类型安全检测机制,该机制允许程序员在编译时检测到非法的类型,类型安全,将本来在运行期的类型ClassCastException错误提前在编译期发现。2. 为什么使用泛型:泛型可以增强编译时错误检测,减少因类型问题引发的异常。泛型可以避免类型转换3 . 泛型算法可以增加代码复用性3. 泛型的类型参数命名约定按照约定,类型参数名称命名为单个大写字母,以便可以在使用普通类或接口名称时能够容易地区分类型参数。常用的类型参数名称
2020-07-13 00:41:28
138
转载 C语言获取系统时间
C语言获取系统时间的几种方式 C语言中如何获取时间?精度如何? 1 使用time_t time( time_t * timer ) 精确到秒2 使用clock_t clock() 得到的是CPU时间 精确到1/CLOCKS_PER_SEC秒3 计算时间差使用double difftime( time_t timer1, time_t timer0 )4 使用DWOR
2014-07-07 19:39:01
628
原创 单链表
#include #include #include typedef struct LNode{int data;struct LNode *next;}LNode,*LinkList;void Create_L(LinkList L,int n){//生成n的节点,并用随机数给它们赋值int i;LinkList p;p=L;s
2012-07-23 20:29:33
327
转载 VC6.0错误指令及解决方式
检测错误的方法和原则:拖动左下方滚动条,到最上边,从第一条错误开始检查。双击错误信息行,使光标定位到出错的行。错误不一定由定位的行引起,有可能是它上面一行,比如missing ';' before xxx修改完1个错误后,重新编译,有可能后续的错误就消失了。这是因为一处错误可能引起多条出错信息。警告(warning)不影响编译,可以暂时不管。当然严格来说,警告也可能隐含着问题,
2012-07-23 07:55:21
2097
转载 C语言中产生随机数的方法
rand()函数可以用来产生随机数,但是这不是真真意义上的随机数,是一个伪随机数,是根据一个数,我们可以称它为种子,为基准以某个递推公式推算出来的一系数,当这系列数很大的时候,就符合正态公布,从而相当于产生了随机数,但这不是真正的随机数,当计算机正常开机后,这个种子的值是定了的,除非你破坏了系统,为了改变这个种子的值,C提供了 srand()函数,它的原形是void srand( int a)
2012-07-22 21:01:09
849
转载 linux经典面试题及答案
一.填空题:1. 在Linux系统中,以文件方式访问设备。2. Linux内核引导时,从文件 /etc/fstab中读取要加载的文件系统。3. Linux文件系统中每个文件用 i节点来标识。4. 全部磁盘块由四个部分组成,分别为引导块、专用块、 i节点表块和数据存储块。5. 链接分为:硬链接和符号链接。6. 超级块包含了i节点表和空闲块表等重要的文件系统信息。7.
2012-07-22 08:14:42
1675
原创 线性表实现代码
#include#include#define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0 #define INFEASIBLE -1 #define OVERFLOW -2 //Status 是函数反回类型,其值是函数结果状态代码// typedef i
2012-07-21 17:24:59
460
转载 typedef int int_arry[4]
#include using namespace std;int main(){ int ia[3][4]={0,1,2,3,4,5,6,7,8,9,10,11}; typedef int int_array[4]; for (int_array *p =ia;p!= ia+3;++p) { for (int *q=*p;q!=*p+4;++q)
2012-07-21 10:53:44
595
原创 关于typedef的用法
typedef:它为一种类型引入新的名字,而不是为变量分配空间;为复杂的声明定义一个新的简单的别名。方法是:在原来的声明里逐步用别名替换一部分复杂声明,如此循环,把带变量名的部分留到最后替换,得到的就是原声明的最简化版。举例:1. 原声明:int *(*a[5])(int, char*);变量名为a,直接用一个新别名pFun替换a就可以了:typedef int *(*pFun
2012-07-21 10:46:27
523
转载 函数指针和指针函数 数组指针和指针数组
函数指针】 在程序运行中,函数代码是程序的算法指令部分,它们和数组一样也占用存储空间,都有相应的地址。可以使用指针变量指向数组的首地址,也可以使用指针变量指向函数代码的首地址,指向函数代码首地址的指针变量称为函数指针。1.函数指针定义函数类型 (*指针变量名)(形参列表);“函数类型”说明函数的返回类型,由于“()”的优先级高于“*”,所以指针变量名外的括号必不可少
2012-07-20 22:55:00
562
转载 优先级口诀
括号成员第一; 括号运算符[]() 成员运算符. ->全体单目第二; 所有的单目运算符比如++ -- +(正) -(负) 指针运算*&乘除余三,加减四; 这个"余"是指取余运算即%移位五,关系六; 移位运算符:> ,关系:> = 等于(与)不等排第七; 即== !=位与异或和位或; 这几个都是位运算: 位与(&)异或(^)位或(|)"三分天下"八九十;逻辑或跟与; 逻辑
2012-07-20 22:42:55
340
转载 有用的C语言工具
本节包括了一些你应该直到地有用的C语言工具列表,并描述了他们的作用,从表1至表4。本节提供一个易于阅读的总结材料,告诉你这些工具中的每一个是用来干什么的以及可以用在那里找到他们。在学完这个总结材料之后,请接着阅读每个工具的主文档,并在几个不同的a.out中运行每个工具。可以使用”Hello World”程序,也可以使用其他较大的程序。请仔细研究这些工具,如果你花15分钟时间对每个工具进行一下试
2012-07-16 19:36:53
483
1
转载 如果在Linux平台可以用gdb进行反汇编和调试。(转)
2. 最简C代码分析 为简化问题,来分析一下最简的c代码生成的汇编代码: # vi test1.c int main() { return 0; } 编译该程序,产生二进制文件: # gcc test1.c -o test1 # file test1
2012-07-15 21:53:47
1277
转载 a.out
out文件就是扩展名为out的文件,它本身不代表任何信息。在Linux中判断文件是否是可执行文件,首先要看文件的属性是否是可执行的,它没有一个默认的扩展名表示此文件为可执行文件。为了方便,Linux中可执行文件一般都是没有扩展名的。在使用gcc编程时,没有指定输入可执行文件名,默认生成可执行文件a.out文件。执行时必须键入命令 ./a.out,即要带上扩展名,如果键入./a 则不正确,因为它
2012-07-15 21:20:04
722
达内学员提供华为嵌入式内部笔试题
2014-04-13
C语言实现的算法大全
2012-08-11
微软等公司数据结构+算法面试100题(含答案)
2012-06-08
数据结构提要与习题解答
2012-06-08
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人