安卓高级工程师,目前任职于Wifi万能钥匙
能力说明:
精通JVM运行机制,包括类生命、内存模型、垃圾回收及JVM常见参数;能够熟练使用Runnable接口创建线程和使用ExecutorService并发执行任务、识别潜在的死锁线程问题;能够使用Synchronized关键字和atomic包控制线程的执行顺序,使用并行Fork/Join框架;能过开发使用原始版本函数式接口的代码。
暂时未有相关云产品技术能力~
阿里云技能认证
详细说明多线程下载;多任务下载;断点续传;自定义网络库;自定义缓存管理;自定义存储路径;灵活易用,几行代码搞定复杂的下载功能;纯原生代码实现,兼容性高
多线程下载;多任务下载;断点续传;自定义网络库;自定义缓存管理;自定义存储路径;灵活易用,几行代码搞定复杂的下载功能;纯原生代码实现,兼容性高
1.什么是线程 线程就是进程中运行的多个子任务,是操作系统调用的最小单元 2.线程的状态 New:新建状态,new出来,还没有调用startRunnable:可运行状态,调用start进入可运行状态,可能运行也可能没有运行,取决于操作系统的调度Blocked:阻塞状态,被锁阻塞,暂时不活动,阻塞状态是线程阻塞在进入synchronized关键字修饰的方法或代码块(获取锁)时的状态。
1.View的滑动方式 a.layout(left,top,right,bottom):通过修改View四个方向的属性值来修改View的坐标,从而滑动Viewb.offsetLeftAndRight() offsetTopAndBottom():指定偏移量滑动viewc.
说下你所知道的设计模式与使用场景 a.建造者模式:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。使用场景比如最常见的AlertDialog,拿我们开发过程中举例,比如Camera开发过程中,可能需要设置一个初始化的相机配置,设置摄像头方向,闪光灯开闭,成像质量等等,这种场景下就可以使用建造者模式装饰者模式:动态的给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活。
为什么apk越来越大? 1.项目不断发展,功能越多,代码量增加的同时,资源文件也在不断的增多2.app支持的主流dpi越来越多,如ldpi、mdpi、hdpi、xh xxh xxxh等等,间接导致资源增多3.
猫狗队列 注意: 查找了一些网上的写法,发现很多样本再处理pollAll pollDog pollCat方法的时候,并不是如下边的要求弹出所有,原因不详,以我对文字的 敏感性来说,这种只弹出一个的方式是错误的,奈何很多公司的算法题 答案也是如此,所以暂且先这样处理,你完全可以添加一个循环将所有 元.
开发环境 Ubuntu 16 64位+Windows10 开发过程 1.登录Ubuntu切换到root用户(减少权限问题),执行以下命令 apt update 它的作用是同步 /etc/apt/sources.list 和 /etc/apt/sources.list.d 中列出的源的索引,这样才能获取到最新的软件包。
项目源码OpenGL ES 2.0 中文文档 完整代码,一切尽在注释中 extern "C" JNIEXPORT void JNICALL Java_com_rzm_ffmpegplayer_FFmpegPlayer_initOpenGL(JNIEnv.
项目源码OpenSL ES 文档 OpenSLES:(Open Sound Library for Embedded Systems) OpenSLES是跨平台、针对嵌入式系统精心优化的硬件音频加速API。
项目源码FFmpeg开发文档 像素格式转换 像素格式描述了像素数据存储所用的格式。定义了像素在内存中的编码方式。FFmpeg支持的像素格式主要是rbg和yuv两种,具体可以在结构体AVPixelFormat中看到 /** * Pixel format.
项目源码FFmpeg开发文档 解码分为软解码和硬解码,那么什么是软解码和硬解码,二者有什么区别?简单来说,在于是否使用CPU进行解码,最初视频解码都是通过CPU进行的,那时候视频分辨率较低,CPU完全可以胜任解码的工作,但是随着高清视频的出现,使用CPU进行解码的压力越来越大 软解码 使用CPU进行解码,所以就很容易造成CPU负载过大。
项目源码FFmpeg开发文档 Android Studio的开发环境已经准备好,接下来开始正式的写ndk代码,首先创建一个FFmpeg工具类,添加native方法 import android.
项目源码FFmpeg开发文档 1.环境配置 ffmpeg库已经编译好了,接下来准备将so引入Android studio进行开发 我们创建一个新的项目,注意在创建过程中这几个选项的勾选 6C~L[SE8UA3Z]JEAFB~CU24.png 勾选添加C++支持,Android studio会自动帮我们做一些配置,后边进行简单的解释 Y%~`T`0D1PM`(`}}$ENC9G2.png C++ Standard:使用哪种 C++ 标准。
项目源码FFmpeg开发文档 编译过程中涉及到很多ndk中的so库和头文件以及交叉编译的工具,在命令执行的时候会在ndk相应的目录下去查找,所以我们可以使用export命令事先将这些路径设置到环境变量,使用的时候可以很方便的找到 //NDK加入环境变量.
项目源码FFmpeg开发文档 编译过程中涉及到很多ndk中的so库和头文件以及交叉编译的工具,在命令执行的时候会在ndk相应的目录下去查找,所以我们可以使用export命令事先将这些路径设置到环境变量,使用的时候可以很方便的找到 //NDK加入环境变量.
FFmpeg开发文档 前言 之前写了很多关于ndk的文章,也以FFmpeg的编译为例大概的讲述了一次ndk开发从编译到使用的过程,但是内容过于分散,而且有些东西已经过时,比如eclipse工具,比如ndk-build的编译方式以及之前ffmpeg使用的2.x的版本,这些都已经渐渐的不被使用了,这次打算在Android Studio的工具下使用Cmake的编译方式,编译较新的ffmpeg版本,完成一次完整的编译开发过程,实现一次功能较完备的ffmpeg播放器。
HashMap 底层采用数组 + 链表的的实现方式来降低数据插入和查询的时间复杂度,理想状态下可以实现时间复杂度位O(1),今天就从源码的角度看一下它是如何实现的。
Android studio 2.2开始支持cmake的方式进行jni开发,我在另一篇10.Eclipse下Ndk开发(ffmpeg解码)中写过Eclipse下编译ffmpeg的过程,但是现在几乎没有人会使用eclipse作为Android开发工具了,所以很有必要写一下使用Android studio进行jni开发的一般步骤。
/** * 注:StaticLayout是android中处理文字换行的一个类,TextView源码中也是通过这个类实现换行的,使用这个类可以 * 在不进行TextView绘制的前提下得到TextView的宽高,这里我们只需要获取到高度即可,这个高度当然也可以通过post * 在run中获取,但是这样做会有一个问题,界面是先绘制显示然后再计算高度根据我们的逻辑来收缩TextView的高度,在列表中 * 会出现闪烁的问题。
点击EditText之外隐藏键盘的实现方式 重写事件分发dispatchTouchEvent,注意不要在onTouchEvent中操作,因为onTouchEvent并非任何情况下都会被调用。
通常用ValueAnimator实现动画的过渡效果,代码如下 ValueAnimator valueAnimator = ValueAnimator.ofFloat(1, 100); valueAnimator.
smoothScrollToPosition方法可以使RecyclerView滑动到指定的位置,来看下源码 /** * Starts a smooth scroll to an adapter position.
OrientationHelper OrientationHelper是对RecycleView中子View管理的辅助类,它是一个抽象类,类中定义了获取View布局信息的相关方法。
1.简介 SnapHelper是Android 24.2.0 的support 包中添加的一个类,用于辅助RecyclerView扩展滑动效果。比如,通过这个类可以实现RecyclerView像ViewPager一样的滑动,甚至在此基础上再次扩展。
1.结构体中指针变量的深拷贝和浅拷贝 疑问点记录: char *p = (char *)malloc(100); strcpy(p,"renzhenming"); 这两行代码定义了一个字符指针p,他指向堆内存中一段空间,这一段空间存储了一个字符串re...
1.二维数组的本质 二维数组的本质是一个数组指针,放宽来说多维数组的本质也是一个数组指针 int arr[i][j] (arr+i)代表第i行的地址 二级指针 *(arr+i)代表第i行首元素的地址 一级指针 ,第i行地址和第i行首元素地址虽然...
今天的数据库升级将通过这个脚本文件完成,我们假设目前版本迭代中,已经上线了V001 V002版本,近期将要上线V003。首先先理清三个版本的数据库情况,三个版本中都涉及一个个数据库文件(暂不考虑分库的情况),user.
待续。。。
1.排序 形参中的数组,编译器会把他当作指针处理 形参写在函数上,和写在函数内是一样的,只不过是 写在函数上具有对外的属性 2.关于数组地址 看下面函数的运行结果,你会发现,b+1和&b+1的区别,b表示的是数组元素首地址,所以b+1就是将从首元素向后...
概述 第三方开源的图片框架很多,这里自己去写一个的目的是通过这样一个写的过程,拓展自己对架构设计的理解,包括设计模式,线程,策略,缓存等等。另外大型的框架例如Glide,代码很完善,扩展性很高,但是阅读起来有难度,而实际上,这些框架底层实现原理都是类似的,所以通过构建一个简单框架的过程更加有助于对其原理的理解,算是为阅读复杂的第三方源码打下一个基础。
未完.待续....
使用方法: 1.下载AndFix源码:https://github.com/alibaba/AndFix 2.生成两个apk文件,一个是含有bug的old.
有这样一个布局,Activity中有一个ViewGroup,ViewGroup中又放了一个View,我重写了Activity的dispatchTouchEvent和onTouchEvent,重写了ViewGroup的dispatchTouchEvent...
1.FILE*文件指针讲解 FILE所有平台得名字都一样,FILE是一个结构体类型,里面得成员功能一样,不同平台成员得名字不一样,这个结构体可以在stdio.
Glide.with(mContext).load("baidu.com") .centerCrop().
今天带着一个问题来看Android View的绘制流程 View的绘制入口在哪? 很多时候,在进入到一个页面的时候,会需要动态的获取到布局中某一个view的宽度或者高度,但是我们发现如果直接在onCreate方法或者onResume方法中通过这种方式去取高度值得到的是0 int measuredHeight = mTextView.
结构体 1.结构体定义和初始化 #define _CRT_SECURE_NO_WARNINGS #include #include //定义一个结构体【类型】 //strut 是关键字 //struct Worker合起来才是结构体类型 //结构体...
在程序没有执行前,有几个分区已经确定,不过分区虽然确定,但是没有加载内存,程序只有运行时才加载内存 text(代码区):只读,函数 data:初始化的数据,全局变量,static变量,文字常量区 bss:没有初始化的数据,全局变量,static变量 当...
大多的开源图片框架针对图片加载都采用了三级缓存的方式,大概流程通常是这样的,加载图片时,首先检查内存中是否仍然保有这个图片对象,如果有则直接显示到控件上,加载过程到此结束;如果内存中没有,则可能是第一次加载,还没有缓存或者内存中的缓存被销毁,这时候去本地缓存中读取,通常是写入到了文件中,如果文件中读取到了缓存,则设置给控件显示,加载结束,如果没有缓存,则再请求服务器返回,这时候会将获取到的图片写入到本地硬盘(文件)中,(或者同时在内存中也写入一份),同时设置给图片显示。
1.TCP/IP协议家族 HTTP,FTP,DNS,TCP,UDP,IP OSI七层模型:应用层,表示层,会话层,传输层,网络层,数据链路层,物理层 五层协议: TCP三次握手(建立连接)和四次挥手(断开连接) HTTP请求:以报文形式通信 客户端请求...
EventBus3.0源码写的很有代表性,其中涉及到的设计模式以及数据结构都很值得拿来一读,看源码的目的不能仅仅局限于了解其原理,更大的作用在于能提高自己构建稳健架构的能力。
上一次分析了RxJava的运作流程,其中的线程调度方面只是简单提了两句,以我看来,线程调度是RxJava中非常重要的一环,所以今天单独拿出来分析一下。 subscribeOn observeOn subscribeOn调用可以将之前的操作加如线程池,从...
RxJava线程切换非常方便,只要调用subscribeOn(Schedules.io())就可以使前边的操作运行于子线程,调用obsersableOn(AndroidSchedules.
在类上定义泛型 类上定义的泛型是在对象实例化的时候指定的,可以用于类中定义的成员变量和成员方法,但是不包括静态成员变量和静态成员方法,因为静态变量和方法的调用可以通过类名实现,不需要创建类的对象,因此此时类上定义的泛型还没有被指定,所以静态不能使用类定...
基本使用 在build.gradle中加入配置,注意,rxJava和rxAndroid版本一定要相互兼容,不然可能会报错More than one file was found with OS independent path 'META-INF/rxjava.