自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

fw_2012的专栏

大道至简 知易行难

  • 博客(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 125

原创 RxJava-- 响应式编程

定义:Reactive Extensions(下面简称 Rx)

2021-09-12 21:52:18 104

原创 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 4680

原创 序列化的过程

序列化:将数据结构或对象转换成二进制的过程。序列化的用途: 网络上,跨进程序列化方案:json xml protobuf serializable(java) percelable(Android独有)....持久化:把数据结构或对象存储起来 硬盘如何选择合理的序列化方案。Serializable学习:public interface Serializable { } 里面没有任何方法,就是一个标志。public interface Externalizable ex

2021-09-04 07:18:29 341

原创 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 1690

原创 阻塞队列和线程池原理

1. 阻塞队列的两种形式1. 空的队列里面拿元素 2.满的队列里面塞元素add remove 不阻塞但是会抛异常offer poll -- 不阻塞但是会抛异常take put --- 阻塞

2021-08-20 07:49:26 85

原创 线程并发编程

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 71

原创 Android 动态代理

当一个实例出现多个接口的时候,使用静态代理就不实用了。就要选择动态代理。可以构造Invacation的构造函数,来用于invoke函数的反射使用。invoke真正被调用的形式如下:

2021-08-18 22:24:06 199

原创 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 70

原创 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 114 1

原创 JVM内存管理深度剖析,GC算法与底层原理

JVM内存管理深度剖析,GC算法与底层原理

2021-07-23 23:17:16 280

原创 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 270

原创 应用出现内存泄漏处理方式

内存泄漏的处理方式获取实时内存泄漏的命令: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 243

原创 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 189

原创 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 249

原创 Binder学习笔记

Binder是什么?进程间通信机制也是一个驱动Binder.java 它实现了Ibinder(只要实现了Ibinder 接口 就具备了跨进程通讯的能力) —这个是为什么昵?多进程的原因为了 占用更大的内存空间, 每个进程拥有一个虚拟机,实现风险隔离,,每个进程相当一个单独的APP,将一个比较危险的动作放到单独的进程中,这样就算一个进程挂掉了 也不影响应用。Linux 进程间通讯的方式管道 信号量 文件管理 共享内存 soekcetBinder 优点:1.拷贝一次。2.

2020-09-18 23:35:37 107

原创 Handler 源码笔记

Handler所有的思想设计都是源于生活高于生活。大概知识点: 源码epoll 设计思路 设计模式 异步消息 同步消息 消息屏障 IntentServer管理机制: 消息管理所有的消息所有的代码都在handler中运行的。MassegeQuaua 是变量 是共享内存的...

2020-09-18 00:59:19 92

原创 Java多线程编程

Java多线程一个进程最多可以创建1000个线程,开一个线程大概要消耗1M的内存,超过这个线程数字将会出现线程泄漏。时间片轮转机制

2020-08-11 00:18:01 86

原创 Android内存泄漏分析

内存泄漏分析找到第一次内存泄漏日志点使用MAT工具找到问题点。monkey或者什么样的测试,使用脚本每隔一段时间固定抓取一次.hprofwen文件,使用MAT工具查看,只要内存由于他在稳定的增长,不需要完全内存泄漏复现,基本就可以认定这个它造成的内存泄漏。下面是关于MAT工具的使用说明:...

2020-07-27 23:44:50 79

原创 Java反射

Java反射

2020-07-27 00:25:13 82

原创 Java 泛型

Java泛型1. 什么是泛型?是JDK5引起的新特性,泛型提供了编译时类型安全检测机制,该机制允许程序员在编译时检测到非法的类型,类型安全,将本来在运行期的类型ClassCastException错误提前在编译期发现。2. 为什么使用泛型:泛型可以增强编译时错误检测,减少因类型问题引发的异常。泛型可以避免类型转换3 . 泛型算法可以增加代码复用性3. 泛型的类型参数命名约定按照约定,类型参数名称命名为单个大写字母,以便可以在使用普通类或接口名称时能够容易地区分类型参数。常用的类型参数名称

2020-07-13 00:41:28 93

转载 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 569

转载 vim安装的配置问题

在ubuntu 12.04 中使用 sudo apt-get ins

2014-07-05 23:35:33 559

原创 单链表

#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 299

转载 VC6.0错误指令及解决方式

检测错误的方法和原则:拖动左下方滚动条,到最上边,从第一条错误开始检查。双击错误信息行,使光标定位到出错的行。错误不一定由定位的行引起,有可能是它上面一行,比如missing ';' before xxx修改完1个错误后,重新编译,有可能后续的错误就消失了。这是因为一处错误可能引起多条出错信息。警告(warning)不影响编译,可以暂时不管。当然严格来说,警告也可能隐含着问题,

2012-07-23 07:55:21 1805 1

转载 C语言中产生随机数的方法

rand()函数可以用来产生随机数,但是这不是真真意义上的随机数,是一个伪随机数,是根据一个数,我们可以称它为种子,为基准以某个递推公式推算出来的一系数,当这系列数很大的时候,就符合正态公布,从而相当于产生了随机数,但这不是真正的随机数,当计算机正常开机后,这个种子的值是定了的,除非你破坏了系统,为了改变这个种子的值,C提供了 srand()函数,它的原形是void srand( int a)

2012-07-22 21:01:09 812

转载 linux经典面试题及答案

一.填空题:1. 在Linux系统中,以文件方式访问设备。2. Linux内核引导时,从文件 /etc/fstab中读取要加载的文件系统。3. Linux文件系统中每个文件用 i节点来标识。4. 全部磁盘块由四个部分组成,分别为引导块、专用块、 i节点表块和数据存储块。5. 链接分为:硬链接和符号链接。6. 超级块包含了i节点表和空闲块表等重要的文件系统信息。7.

2012-07-22 08:14:42 1599

原创 线性表实现代码

#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 421

转载 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 560

原创 关于typedef的用法

typedef:它为一种类型引入新的名字,而不是为变量分配空间;为复杂的声明定义一个新的简单的别名。方法是:在原来的声明里逐步用别名替换一部分复杂声明,如此循环,把带变量名的部分留到最后替换,得到的就是原声明的最简化版。举例:1. 原声明:int *(*a[5])(int, char*);变量名为a,直接用一个新别名pFun替换a就可以了:typedef int *(*pFun

2012-07-21 10:46:27 482

转载 函数指针和指针函数 数组指针和指针数组

函数指针】       在程序运行中,函数代码是程序的算法指令部分,它们和数组一样也占用存储空间,都有相应的地址。可以使用指针变量指向数组的首地址,也可以使用指针变量指向函数代码的首地址,指向函数代码首地址的指针变量称为函数指针。1.函数指针定义函数类型 (*指针变量名)(形参列表);“函数类型”说明函数的返回类型,由于“()”的优先级高于“*”,所以指针变量名外的括号必不可少

2012-07-20 22:55:00 508

转载 优先级口诀

括号成员第一; 括号运算符[]() 成员运算符. ->全体单目第二; 所有的单目运算符比如++ -- +(正) -(负) 指针运算*&乘除余三,加减四; 这个"余"是指取余运算即%移位五,关系六; 移位运算符:> ,关系:> = 等于(与)不等排第七; 即== !=位与异或和位或; 这几个都是位运算: 位与(&)异或(^)位或(|)"三分天下"八九十;逻辑或跟与; 逻辑

2012-07-20 22:42:55 300

转载 有用的C语言工具

本节包括了一些你应该直到地有用的C语言工具列表,并描述了他们的作用,从表1至表4。本节提供一个易于阅读的总结材料,告诉你这些工具中的每一个是用来干什么的以及可以用在那里找到他们。在学完这个总结材料之后,请接着阅读每个工具的主文档,并在几个不同的a.out中运行每个工具。可以使用”Hello World”程序,也可以使用其他较大的程序。请仔细研究这些工具,如果你花15分钟时间对每个工具进行一下试

2012-07-16 19:36:53 423 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 1224

转载 a.out

out文件就是扩展名为out的文件,它本身不代表任何信息。在Linux中判断文件是否是可执行文件,首先要看文件的属性是否是可执行的,它没有一个默认的扩展名表示此文件为可执行文件。为了方便,Linux中可执行文件一般都是没有扩展名的。在使用gcc编程时,没有指定输入可执行文件名,默认生成可执行文件a.out文件。执行时必须键入命令 ./a.out,即要带上扩展名,如果键入./a 则不正确,因为它

2012-07-15 21:20:04 568

达内学员提供华为嵌入式内部笔试题

(1)什么是预编译,何时需要预编译: 答案: 1、总是使用不经常改动的大型代码体。 2、程序由多个模块组成,所有模块都使用一组标准的包含文件和相同的编译选项。在这种情况下,可以将所有包含文件预编译为一个预编译头。 (2)char * const p      char const * p      const char *p 上述三个有什么区别?

2014-04-13

C语言实现的算法大全

算法描述 c语言实现 1.河内之塔 2.Algorithm Gossip: 费式数列 3. 巴斯卡三角形 4.Algorithm Gossip: 三色棋 5.Algorithm Gossip: 老鼠走迷官(一)

2012-08-11

微软等公司数据结构+算法面试100题(含答案)

1.把二元查找树转变成排序的双向链表(树) 题目: 输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。 要求不能创建任何新的结点,只调整指针的指向。 10 / / 6 14 / / / / 4 8 12 16 转换成双向链表 4=6=8=10=12=14=16。 首先我们定义的二元查找树 节点的数据结构如下: struct BSTreeNode { int m_nValue; // value of node BSTreeNode *m_pLeft; // left child of node BSTreeNode *m_pRight; // right child of node }; 2.设计包含min函数的栈(栈) 定义栈的数据结构,要求添加一个min函数,能够得到栈的最小元素。 要求函数min、push以及pop的时间复杂度都是O(1)。 3.求子数组的最大和(数组) 题目: 输入一个整形数组,数组里有正数也有负数。 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。 求所有子数组的和的最大值。要求时间复杂度为O(n)。 例如输入的数组为1, -2, 3, 10, -4, 7, 2, -5,和最大的子数组为3, 10, -4, 7, 2, 因此输出为该子数组的和18。 4.在二元树中找出和为某一值的所有路径(树) 题目:输入一个整数和一棵二元树。 从树的根结点开始往下访问一直到叶结点所经过的所有结点形成一条路径。 打印出和与输入整数相等的所有路径。 例如 输入整数22和如下二元树 10 / / 5 12 / / 4 7 则打印出两条路径:10, 12和10, 5, 7。 二元树节点的数据结构定义为: struct BinaryTreeNode // a node in the binary tree { int m_nValue; // value of node BinaryTreeNode *m_pLeft; // left child of node BinaryTreeNode *m_pRight; // right child of node };

2012-06-08

数据结构提要与习题解答

数据结构提要与习题解答 严蔚敏版 1.插入类 (如直接插入排序、折半插入排序、2-路插入排序、希尔排序)      将无序子序列中的一个或几个记录“插入”到有序序列中,从而增加记录的有序子      序列的长度。   (2) 交换类 (如起泡排序、快速排序)      通过“交换”无序序列中的记录从而得到其中关键字最小或最大的记录,并将它加      入到有序子序列中,以此方法增加记录的有序子序列的长度。   (3) 选择类 (简单选择排序、锦标赛排序、堆排序)      从记录的无序子序列中“选择”关键字最小或最大的记录,并将它加入到有序子序      列中,以此方法增加记录的有序子序列的长度。   (4) 归并类       通过“归并”两个或两个以上的记录有序子序列,逐步增加记录有序序列的长度。   (5) 其它方法 (如基数排序)

2012-06-08

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除