- 博客(31)
- 收藏
- 关注
原创 Exif图片方向的一些发现
背景首先,先要了解Exif是个什么东东,搬出百度百科可交换图像文件格式(英语:Exchangeable image file format,官方简称Exif),是专门为数码相机的照片设定的,可以记录数码照片的属性信息和拍摄数据。说到底Exif就是一种格式,用来存储图片的一些信息,这些信息和我们日常比较相关的有拍摄设备,拍摄地点,图片尺寸等,不过今天的主角是另外一个——那就是图片方向(or...
2018-10-14 22:27:23
4265
1
原创 subsampling-scale-image-view加载长图源码分析总结
subsampling-scale-image-view源码分析背景介绍使用源码分析总结参考背景对于安卓开发人员,最头疼的问题就是内存问题了,而内存问题又当属bitmap最头疼,虽然说现在市面上已经有越来越多成熟的图片加载框架,像Fresco,Glide,它们也确实帮我更好地管理了图片的内存,生命周期等,但是还是有一个比较棘手的问题,那就是大图长图的加载,动辄750 * 30000的长图,如果...
2018-10-14 15:24:12
4210
原创 Bitmap ImageView大小探究
前言我们平时在使用ImageView,当设置宽高为wrap_content的时候,设置bitmap,有没有想过一个问题,那就是大小究竟是如何计算的,平时说的那些density又和最终显示的图片大小有什么关系呢。本着严谨的态度,我开始了探索源码解读的不归路上。过程本次实验所用测试机density为420。我们首先来解码一张bitmap(ic_launcher大小为144 * 144),代码如...
2018-10-11 10:34:23
723
原创 subsampling-scale-image-view加载长图源码分析(二)
subsampling-scale-image-view源码分析概要分析总结概要subsampling-scale-image-view是一个支持部分加载大图长图的图片库,并且还支持缩放,在subsampling-scale-image-view加载长图源码分析(一)已经介绍过它的用法和部分源码,没有看过的朋友可以先移步看前面的分析。分析上回说到采样率等于1的情况下,因为不需要缩放和部分加...
2018-10-01 17:10:32
2046
原创 subsampling-scale-image-view加载长图源码分析(一)
subsampling-scale-image-view部分加载bitmap源码分析
2018-10-01 12:32:36
5934
3
原创 我对于适配器模式的理解
适配器模式概念介绍使用想法参考概念在设计模式中,适配器模式(英语:adapter pattern)有时候也称包装样式或者包装(wrapper)。将一个类的接口转接成用户所期待的。一个适配使得因接口不兼容而不能在一起工作的类能在一起工作,做法是将类自己的接口包裹在一个已存在的类中。引用自wiki介绍使用适配器模式总共由三个角色组成,分别是目标对象Target,被适配对象Adaptee和适...
2018-09-20 23:33:33
1770
1
原创 线程阻塞之join和CountDownLatch的简单使用
介绍通常使用线程的时候,我们很少需要去阻塞线程,一般通过回调返回数据既可,但是有些场景比方说,线程中需要等待另外一个线程的结果,这时候我们就可以通过显示地去阻塞线程,等待线程结束获得数据。一般可以使用CountDownLatch 或者线程的join方法进行线程的同步阻塞。线程阻塞的一些知识可以查看这篇文章。使用join方法,代码如下 private void blo...
2018-09-17 10:51:42
383
原创 wait线程阻塞
介绍线程阻塞通常是指一个线程在执行过程中由于某种原因从运行状态转为暂停状态的过程,线程阻塞会放弃CPU的使用权, 并且等待某个条件重新从暂停状态改为就绪状态。在Java中,通常使用object.wait让线程进入阻塞状态。使用首先我们先看wait方法,wait方法总共有三个重载方法,分别是 wait() wait(long timeout) wait(long timeout...
2018-09-16 19:12:40
3165
原创 编码知识整理
前言 可能很多人事先没有了解好相关的编码知识,就把Unicode编码和UTF-8编码混为一谈相互比较,认为是两种不同的编码,其实不然,Unicoe编码只是一个字符集,规定了字符和二进制代码的对应关系,好比是一个大字典,但是对于如何编码存储在计算机及其具体实现,Unicode编码并没有做规定,而UTF-8编码就是Unicode编码的一种实现方式,它定义了解析存储的一整套编码规则,所以,就关系...
2018-09-08 13:01:03
466
原创 Java字节码介绍及动态修改类
前言对于Java字节码,它是在Java类的编译过程产生的,即由.java源文件到.class二进制字节码文件的过程。而Java类的加载又是通过类的名字获取二进制字节流,然后在内存中将字节流生成类对象。所以动态修改类的时机在于修改.class文件,只要通过修改.class文件的字节码,即可达到修改类的目的。修改字节码可以通过ASM这个开源框架实现,ASM是一个Java字节码引擎的库,具体可以查看...
2018-09-06 18:36:30
11955
原创 App优化的思考,整理以及分析。
前言 随着APP开发的业务进展到一定的程度,无论是App安装包的体积也好,运行内存也好等方面都出现了极大的问题,安装包体积不断增大,运行内存过大容易导致OOM,这些问题都亟需解决,也是进阶的必备之路。既然前期已经污染了,后期就一定要加紧治理,所以这几天也进行了一定的思考和整理。分析 从App的角度先分析了几个方面的优化,当然只是初期的整理,如下: 一开始的设想是想对显而易...
2018-08-19 17:08:42
2588
原创 一次内存泄露的分析及总结
概要项目也使用LeakCanary一段时间了,也确实检测出了内存泄露,只是碍于项目进度,一直没有去进行分析。现在有时间了,就开始着手进行分析。LeakCanary泄露如下: 欢迎页泄露了26M,可怕吧。过程首先需要找出泄露的根源,LeakCanary也提供了这方面的帮助,点击泄露的项进去如下所示: 可以发现是线程导致的内存泄露,但是提供的信息还太小,所以接下来需要使用一个...
2018-08-14 11:19:09
1161
原创 使用 SQLCipher加密数据库的错误总结(file is not a database: , while compiling: select count(*) from sqlite_master
使用经历如下 由于项目中需要用到加密数据库,使用特意用了github的经典项目 sqlcipher, 使用起来也很简单,和原生的数据库没有差异,甚至连类名都一样,只是包路径需要替换为Sqlcipher的相应路径。还有获取数据库的方式需要加上密码,如 SQLiteOpenHelper.getWritableDatabase(“secret”)。一开始接入也没有想太多,就直接用了。没想到,后来b...
2018-08-05 17:05:16
36143
7
原创 Android Paging分页库的学习(一)—— 结合本地数据进行分页加载
Paging分页库的介绍Paging分页面是google推出的一个结合RecyclerView进行分页加载数据的一个全新架构库,主要是为了解决一次性加载大量数据而造成的资源浪费问题。通过分页的方式,每次加载一页数据,既可以加快界面的渲染,又可以减少对象等资源的创建消耗。具体可以看官网分页库主要由以下三个部分组成DataSource: 数据源,定义获取数据的方式,有三种方式,分别是...
2018-07-22 17:12:45
1837
原创 Android Paging分页库的学习(二)—— 结合Room数据库进行分页加载
Paging分页库的介绍Paging分页面是google推出的一个结合RecyclerView进行分页加载数据的一个全新架构库,主要是为了解决一次性加载大量数据而造成的资源浪费问题。通过分页的方式,每次加载一页数据,既可以加快界面的渲染,又可以减少对象等资源的创建消耗。具体可以看官网分页库主要由以下三个部分组成DataSource: 数据源,定义获取数据的方式,有三种方式,分别是...
2018-07-15 17:55:54
6660
2
原创 Android sqlite syntax error 引发的错误以及思考
相信不少人都会使用android的内置数据库sqlite进行数据库查询,也或多或少会遇到这个问题 android.database.sqlite.SQLiteException:near syntax error (code 1):一般来说,这个异常出现的情况是数据库的语法书写错误,很正常嘛,有时候sql的查询语句这么长,也难免会打漏个空格什么的之类的。但是今天我遇到了同样...
2018-04-29 17:59:22
1821
原创 烦人的DexException Unable To Merge Dex
在引入一个新的依赖库之后,相信不少人看到这个报错真的是头疼,其实在之前我也是这样,第一反应就是clean build,然后发现重复几次并没有用。然后开始百度查找方案,尝试无果之后就把库换掉。 其实归根到底,还是因为控制台报错信息不完整,没有具体告诉你哪个类或者哪个包重复了,接下来我想说的就是如何打印出更多的报错信息。一般来说,控制台会提示如下信息:Run with --sta...
2018-04-04 09:33:17
5595
1
原创 fragment 在后台被杀死 数据丢失
问题描述日常排查bugly上面的错误时,发现Nullpointer的问题特别严重,而相关的特征都是应用在后台和应用带fragment。排查代码发现都做了为空判断,为什么还会出现空对象的情况呢?模拟场景如果应用常驻后台,内存有可能会被系统回收,当用户重新打开应用时,app进行恢复操作,此时应用报错。模拟后台内存不足可以使用android studio的自带功能,如下,将应用退到后台,点击x按钮
2017-12-10 17:11:30
1954
原创 Android Base64编码
Base64编码简介Base64编码是一种编码方式,可以把二进制数据编码为可见的字符数据,包含64个字符,A-Z, a-z,0-9,+,/,除此之外还有一个填充字符是后缀等号’=’。由于Base64编码是六位一个字符,而一个字节占八位,所以编码的时候如果字节不是三的倍数,需要添加零值,注意,由于一个字节占六位,所以编码之后高两位会补0。如Xu X u 零值 01011000
2017-12-10 16:36:15
18519
转载 HashMap原理
转载链接 HashMap原理详情请查看原文,以下是部分总结简单地说,HashMap 在底层将 key-value 当成一个整体进行处理,这个整体就是一个 Entry 对象。HashMap 底层采用一个 Entry[] 数组来保存所有的 key-value 对,当需要存储一个 Entry 对象时,会根据hash算法来决定其在数组中的存储位置,在根据equals方法决定其在该数组位置上的链
2017-11-21 22:37:19
204
原创 自定义视图---圆角柱状图(一)
一、写在前文之前写过一篇博客 – 巧妙使用WilliamChart绘制出只有两个圆角的柱状图,当时是项目需要,所以用了第三方的库去实现只有顶部带两个圆角的柱状图。虽然最终是实现了效果,但是第三方的图表自定义不够,例如控制柱状图的间距,高度等等。所以,最终决定自己去绘制圆角柱状图。二、分析需求首先是绘制圆角矩形,系统为我们提供的API为 drawRoundRect 参数如下: 对与rect,pa
2017-03-05 19:38:59
3897
2
原创 Android SQLiteException: near "": syntax error (code 1) 错误 以及 防止Sql注入
一、写在前文 已经很久没有写过博客了,第一次写博客是在2015年的时候,那时候第一次接触优快云,感觉很新鲜,所以当时就写了好几篇博客,那会刚刚好在学C++,所以写的都是关于C++的,而现在已经学习Android一年多了,心血来潮打开以前的文章,没想到竟然还有300多阅读量。而最近项目刚刚赶好,所以决定从新开始记录博客。二、遇到的问题 项目需求如下:
2017-02-14 11:37:57
24220
原创 关于 释放堆内存出错的 问题
当我们在申请堆内存的时候 如果申请的空间小于我们预定的空间 然后我们释放的空间多于我们申请的空间如 char p[10]; cin>>p; (假设是tao) int len=strlen(p); char *p2=new char[len]; strcpy(p2,p); cout<<p2<<endl;...
2015-06-07 11:44:16
734
原创 关于getchar()cin>> 缓冲区的一点发现
#include<iostream> 首先看到右边这些代码 我们输入3 然后按下回车 此时3被送入键盘缓冲区 using namespace std; 但是cin没办法读入回车键 所以此时缓冲区还有一个回车键未读取 接着int main()...
2015-03-16 16:04:52
574
原创 MFC基本对话框的属性——— 增添最小化 最大化按钮
今天,我无意中发现了右击选择基本对话框,选择属性, 在属性栏中可以选择最小化 最大化框,选择完就可以为对话框增加两个按钮只是最大化的时候,里面的内容不能随之按比例增加 等我以后会了 一定会及时分享的在属性栏中还有好多好玩的属性 大家快点动起手来 美化自己的对话框。
2015-02-12 22:39:22
2139
原创 MFC基本对话框的背景透明化
首先,插入一张位图,格式为BMP 。接下来,添加一个静态文本和编辑按钮。接着,打开类向导。 选择class lnfo即可看到 ,在下拉框中选择window,返回Message Maps,选择CxxDlg ,接着找到WM_EraseBkgnd,双击即可添加一个函数 在函数里面添加代码 即可得到如下所示BOOL CTaoDlg::OnEraseB
2015-02-10 22:58:57
1123
原创 MFC 基于对话框的按钮图标设置
首先 建立一个基本对话框,在ICON中插入一个新的图标资源 在新的图标资源里引入一个格式为 Icon File (.ico)的图标。接下来,添加一个按钮在属性样式里选择图标。然后右击按钮,建立类向导,选择Member Variables ,为按钮添加对象 添加名字为m_button 1; 如图然后选择fileview中的Dlg.cpp 进入cpp文
2015-02-09 11:30:58
2549
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人