自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

许佳佳的博客

热爱生活,热爱技术,热爱互联网,热爱祖国。

  • 博客(350)
  • 资源 (60)
  • 收藏
  • 关注

原创 完全理解 java操作数栈和局部变量表

概要近期学习到字节码操控框架ASM,其中对方法的定义需要设置最大操作数栈和局部变量表。于是,自己又复习了一遍java栈帧的概念。如果对栈帧概念还不了解的读者推荐看下此文章:详细解析Java虚拟机的栈帧结构例子综述本文将会通过诸多字节码的例子,来具体分析在不同情况下的方法的操作数栈和局部变量表。本文的分析主要基于javac和javap的使用:首先用javac生成java文件编译...

2020-04-05 09:30:43 2056 1

原创 动态编译入门(gradle Transform Demo)

概述现在市面上的插件化框架,热修复框架几乎都使用了动态编译技术。动态编译的实质是,使用gradle transform api,在项目构建过程的class文件转成dex文件之前,通过自定义插件,进行class字节码处理。本文主要是通过走一遍简单Demo实现流程,让读者能对动态编译有一个大概的了解。如对一些细节知识有更多需求的读者就需要自行学习了。简单Demo本文的Demo,通过动态...

2020-03-29 10:29:58 1866

原创 编译时注解 AbstractProcessor (Activity路由Demo)

概述前一篇文章已经整理过注解的一些概念,也是附上了运行时注解的Demo,如果对注解概念不是很熟的读者建议先看下前一篇文章:android 注解入门(Acitivity路由demo)此篇文章主要讲一下编译时注解的使用,同时也是以”Activity路由“的Demo为例子。本篇的Demo主要是演示了使用编译时注解来创建文件的功能。主要模块anotationrouter:创建注解pro...

2020-03-22 16:26:04 2652 1

原创 android 注解入门(Acitivity路由demo)

参考《Java编程思想》概述近期接触了路由和模块间通信的内容,发现Java注解非常常用。避免后面看各源码被其阻塞,大致了解了下,作此文记录之。注解类型@Target@Retention@Documented@Inherited@Target用于描述注解的使用范围,可能的ElementType参数如下:CONSTRUCTOR:用于描述构造器FIELD:用于描述域L...

2020-03-14 16:50:55 724

原创 bindService 源码解析(为什么是异步)

概述Andromeda 源码解析 (同步获取服务):https://xujiajia.blog.csdn.net/article/details/104166843前一篇文章分析了Andromeda的源码,其中提到,bindService获取IBinder对象的操作是异步的。那么为什么会是异步的呢,其中做了哪些操作呢?此文会围绕这个主题展开。在此推荐下看Android源码网站:htt...

2020-02-05 21:00:46 2341 1

原创 Andromeda 源码解析 (同步获取服务)

AndromedaAndromeda是爱奇艺开源的适用于多进程架构的组件通信框架。github地址: https://github.com/iqiyi/Andromeda其特点如下:无需开发者进行bindService()操作,也不用定义Service,只需要定义aidl接口和实现同步获取服务。抛弃了bindService()这种异步获取的方式,改造成了同步获取生命周期自动管理。...

2020-02-04 21:56:02 2706

原创 Android实现 曲线路径动画

本文参考https://www.jianshu.com/p/fea4d1f6512a概述近期碰到曲线动画的实现问题,写本文记录下。动画类似“剑与远征”游戏的金币动画,动画路径如下图:思路通过贝塞尔曲线计算出x和y的位置(各个点的位置需要自己微调)(此部分内容参考此文:https://www.jianshu.com/p/fea4d1f6512a)通过ValueAnimator...

2020-02-03 21:16:03 4868

原创 ViewTreeObserver 监听View的状态

官方文档https://developer.android.com/reference/android/view/ViewTreeObserverv概述近期碰到要再OnCreate中获取View绘制结束之后的宽高,用到了ViewTreeObserver.OnGlobalLayoutListener。鉴于ViewTreeObserver的确比较实用,于是写本文记录下。官方描述A v...

2020-02-03 21:15:47 1852

原创 微信分享报错 checkArgs fail, thumbData is invalid (bitmap压缩)

概述近期使用微信分享碰到报错:checkArgs fail, thumbData is invalid查阅文档后发现是因为分享缩略图的大小不可超过32kb。于是在框架里加入了压缩图片的逻辑。源码压缩逻辑很简单:查看数据是否超过限制,如果超过就将bitmap质量再减一半。 /** * Bitmap转换成byte[]并且进行压缩,压缩到不大于maxkb * ...

2020-01-11 08:25:33 1166

原创 fresco webp动图只播放一次

概述本文适合类似于以下这些需求:要求webp动图播放一遍后就暂停要求webp动图播放一遍后就消失要求webp动图播放一遍后做其他逻辑具体实现在ControllerListener中将Animatable对象转化成AnimatedDrawable2通过AnimatedDrawable2获取到webp的总帧数每执行一帧记录一次,当记录的帧数等于总帧数的时候认为动画播放了一遍...

2020-01-11 08:01:19 2898

原创 android 自定义圆角button(自定义View Demo)

概述在平时开发过程中经常会碰到需要使用圆角button的情况,一般也会包括很多其他小功能,比如要在里面添加img,设置不同的圆角大小等。针对这样的场景,直接使用创建多个shape,定义多个xml文件也是可以实现的。但是如果使用非常频繁,那么直接自定义一个就会来的非常方便。甚至在一些情况下,不是可以用shape定义的规则图形,比如需要用到贝塞尔曲线等。如果全局需要这样风格的view,那么自...

2019-12-25 20:52:31 1598

原创 RemoteCallbackList源码解析

概要之前已经写过了RemoteCallbackList的使用,此文就不讲demo了。对RemoteCallbackList的使用有兴趣的读者可以看笔者之前的文章:android Binder 实现异步回调官方描述Takes care of the grunt work of maintaining a list of remote interfaces, typically for t...

2019-12-14 10:34:07 1668

原创 android 腾讯X5 首次安装App 无效问题 (webview报错TypeError)

问题腾讯X5 webview在两种情况下使用,在首次启动会有问题:1、应用启动后马上调用webview2、新启一个进程使用webview,并且在新进程中初始化X5此问题只会在首次安装的时候出现,第二次启动App的时候就不会有问题了。报错如下: TypeError: Cannot read property 'getExtension' of null原因首次安装本地没有X5内...

2019-11-27 20:35:10 3569

原创 android使用gradle优化多module的依赖管理

概述在一个项目有多个module 的时候,不可避免的会存在不同的module会有相同的依赖的问题。最一般的做法,我们开发要引入一个依赖的时候,就去看一下其他项目依赖了哪个版本,然后复制粘贴。但是一旦发现其他多项目对同一个库,存在依赖多个版本的时候,也就不知道复制哪个了。碰到这种情况,就只能增加沟通成本了。针对这种情况,我们可以对依赖增加一个统一的版本控制。这样即使是刚参与开发的同事也能不需...

2019-11-23 14:21:27 2416

原创 android 保存图片(视频)到相册

概论没有什么技术,主要记录下功能的实现。此功能实现步骤如下:将图片存储到手机picture目录下。(一般是从原位置复制过来)发送广播触发相册扫描逻辑。本文的例子是将应用自带的内容存储到picture目录。笔者看到目前市场上一些app有直接存储到DCIM目录下的。也是可行的,但是笔者个人认为最好还是只有相机相关功能生成的图片与视频存储到该目录下,否则就用户体验来讲可能会让人比较奇怪...

2019-11-23 10:27:16 7262 1

原创 android 不规则图形排列和点击事件(触摸事件)处理

概述android偶尔会有排列不规则图形的需求,比如平行四边形,梯形等。对于这些图形,往往会有点击、动画等需求,需要在View本身的绘制和触摸事件上都做一些单独的处理。本文以平行四边形为例子,记录下对不规则图形的处理。demodemo主要实现了平行四边形的排列和点击。主要实现过程:重写onDraw,在矩形的View区域中只画出平行四边形的内容。(最终显示效果中,多个View是重叠...

2019-11-10 09:12:21 2221

原创 android webview拦截加载离线文件

概述客户端经常会通过使用webview来用H5实现一些ios与android双端都有的功能,最常见的比如一些活动页面,内部广告页面等。这些页面大概会有以下几个特点:要求webview快一些,白屏时间不要太长要求能够动态更新(因此不能写死在app包中)动态更新不会很频繁对于这种场景,客户端可以再webview展示之前提前拉取需要展示的内容。(一般会是直接拉取zip包到本地解压,当然也...

2019-11-09 12:20:17 1941 1

转载 android binder 要点记录

转载自http://gityuan.com/2015/10/31/binder-prepare/https://www.zhihu.com/question/39440766android 为什么要用binder(1)从性能的角度数据拷贝次数:Binder数据拷贝只需要一次,而管道、消息队列、Socket都需要2次,但共享内存方式一次内存拷贝都不需要;从性能角度看,Binder性能仅...

2019-11-09 09:25:18 306

转载 fresco要点记录

本文参考https://github.com/facebook/frescohttps://juejin.im/post/5a7568825188257a7a2d9ddb概述近期使用到fresco,各要点总结记录下。本文内容多为转载或翻译。官方描述特点fresco官方的描述中主要有以下几个特点:原生的bitmap在被渲染出来后,native的资源就会被回收。这个操作是在UI线程...

2019-11-09 09:10:25 400

原创 rxlifecycle bindUntilEvent源码解析

概述rxjava使用时有个常见的问题:我们经常会在onNext中执行一些ui操作,当执行完耗时操作触发onNext的时候,Activity有可能已经destory了,我们期望是就不去执行onNext中的内容了。这种操作使用rxlifecycle来实现非常容易,只需一行代码即可:observable.compose(this.<String>bindUntilEvent(Acti...

2019-11-03 15:00:13 1452

原创 使用RecyclerView解决滑动冲突(RecyclerView添加header)

概述在android平时开发中,经常会碰到同一个页面中有多个list的问题,或者需要再一个list中存在静态布局需要与list一起滚动的的需求。针对这些情况,笔者尝试过多种方法,如:scrollView嵌套recyclerView,recyclerView嵌套recyclerView等。(主要工作量是在对分发事件的控制)最终还是认为使用单独的一个recyclerView最为实用,主要优势如下...

2019-11-03 11:42:53 2001

原创 Android模块化-模块间通信(AOP实践)

概述关于项目模块化之前已经写文章详述过,如对这方面不了解的读者可以参考笔者的这篇文章:Java模块化什么是模块间通信对于一般的项目来说,独立模块之间不会相互依赖,如下例子:比如此时有四个模块,主模块,base模块,登录模块,游戏模块。依赖关系应该如下:base模块依赖:无登录模块依赖:base模块游戏模块依赖:base模块主模块依赖:base模块、登录模块、游戏模块如上面例...

2019-10-19 11:25:19 1260

原创 Android动画总结 (valueAnimator、objectAnimator、AnimatorSet、PropertyValuesHolder、Interpolator)

参考官方文档:https://developer.android.com/guide/topics/graphics/prop-animation#api-overview概述笔者近期接触到android动画,将诸多概念都稍微整理了一下。一方面做一个知识的记录,另一方面也给刚接触android动画的初学者一个参考。主要内容ValueAnimatorObjectAnimator(包...

2019-10-13 10:42:38 1718

原创 android Binder 实现异步回调

场景描述此时有A、B两个进程,期望A与B实现进程间通信,并且在逻辑执行完毕后再A进程触发回调。期望过程如下:A进程 调用function()B进程 触发function()B进程 调用callback()A进程 触发callback()执行效果笔者demo中通过打log来记录方法的执行。执行过程大致如下:主进程 bindServiceremote进程 执行function...

2019-10-13 09:12:23 3444 4

原创 Android 可自由拖动的View

概述近期写过一个可自由拖动的View。需求是能在屏幕中随意拖动这个View,然后如果View最终停止在屏幕左边就想左边靠边,如果停止在屏幕右边就向右边靠边。本文是直接把该控件设置成了一个View。也可以使用PopupWindow来做。本人使用到的场景需要根据父布局来隐藏和显示,所以就不适合使用PopupWindow了。注意:这个View适合隐藏了ActionBar的情况,如果没有...

2019-10-07 12:00:05 1999 5

原创 Android Fragment事件透传

概述近期使用Fragment,需要将事件透传到下层(可能是Activity,也可能是其他Fragment),于是作此文记录之。原理其实很简答,就是让Fragment布局中ViewGroup都会将触摸事件传递到下层。主要是通过重写dispatchTouchEvent方法来实现。需要注意的是,如果Fragment布局中嵌套较多,那么每一层都需要重写dispatchTouchEvent这个方法。...

2019-10-07 10:52:28 1900

原创 Android针对快速点击事件的处理

概述当对一个按钮快速点击的时候,往往很可能会多次触发同一个逻辑,在有些场景下,会显得极度不合理。而且,这种情况在性能较低的手机上触发概率更高。比如,点击一个按钮打开登录页面,如果用户点击过快的话,完全可能会跳出两个登录页面。个人总结了一下针对这种情况的几种处理方式,如有问题或者其他更好的方式可以评论交流。处理方式第一次点击后,让点击事件失效这种情况更适合于一些耗时的操作,比如网络操作等...

2019-10-07 08:45:04 2169

原创 coodinatorlayout第一次点击无效的问题

问题描述coodinatorlayout使用AppBarLayout+滑动布局(使用appbar_scrolling_view_behavior),会存在“滑动后第一次点击无效的问题”。(这里的滑动布局可能是nestedScrollView,ScrollView,RecyclerView,ListView等)经查看后,发现在这样的布局中,当滑动布局滑动的时候,有时候滑动布局会一直处于flin...

2019-10-07 08:25:14 1126

原创 android为什么要用EventBus

概览近期接触到EventBus,发现其对于android开发来说其实是一个很有必要的知识要点,但是之前由于项目限制,一直没有机会使用,也不知其作用。网上对于EventBus使用详述的文章有很多,本文就不谈使用了,仅谈为什么要用EventBus。本文各个例子都是为了方便读者理解所写,但是各场景不一定使用EventBus最为合适。如有问题,欢迎评论指出。Activity之间通信一般来讲...

2019-09-22 09:33:49 1611 1

原创 SparseArray 源码解析

前言在Android开发中,在key为Integer的情况下,都建议不用HashMap,使用SparseArray替换。SparseArray与HashMap相比究竟有什么好处呢?概要个人认为两者主要有以下几点区别:SparseArray 比HashMap更轻量,更节省内存。SparseArray的速度肯定比HashMap慢,但是在数据不多的时候,这点速度可以忽略不计。源码解析...

2019-09-08 10:42:05 637

原创 TreeMap 红黑树 源码解析

概念红黑树是一种平衡二叉搜索树。它可以在O(log n)的时间内完成查找,插入和删除。二叉搜索树: 左边的节点都小于父节点,右边的节点都大于父节点。平衡二叉树: 任意左右两个子树的叶子节点的高度相差不超过1。关于二叉树的分类可以看笔者的这篇文章:一句话弄懂常见二叉树类型分成这两个概念来看,红黑树就非常好理解了。二叉搜索树的特性非常容易满足,每次在添加新节点的时候如果小于当前节点,...

2019-08-23 15:32:13 2764 1

原创 ReentrantLock和AQS 源码解析

概要ReentrantLock是一种经常会被用来与Synchronized比较的一种同步机制,其在Java中的应用也十分广泛,比如最常见的BlockingQueue就是使用了ReentrantLock来实现的同步机制。个人认为ReentrantLock和Synchronized的区别主要有以下三点:ReentrantLock等待可中中断ReentrantLock可以实现公平锁Reen...

2019-08-21 22:09:04 484

原创 自定义网络协议总结

为什么要自定义网络协议?目前网络通信常用的应用层协议已经有了HTTPS和HTTP,为什么还要自定义协议呢?个人认为主要有两个好处:更加安全。目前网络上最常见的攻击手段就是抓HTTP/HTTPS包,如果自定义网络协议,抓包工作无法使用,能避开大部分来自于脚本小子的攻击。当然对于直接在TCP/IP层的攻击还是需要由网络协议本身的安全来保证。更加轻便。HTTP/HTTPS在业务上绝对已经...

2019-08-04 09:15:21 3605

原创 netty 长连接 demo

概要近期接触netty长连接方面,实现简单demo记录,主要实现以下内容:使用HashMap存储Channel,保证需要的时候可以根据key获取到。被HashMap存储的长连接实现心跳机制。demo中是以id为key存储在HashMap中,解析内容用到了Gson。为了让demo更容易理解,没有实现粘包分包的逻辑,一旦发生会有问题。对粘包和分包有兴趣的可以看下笔者的另一篇文章:So...

2019-07-20 10:11:33 1006

原创 netty write 和flush 源码解析

本文参考:https://www.jianshu.com/p/1ad424c53e80概要netty中每次write之后都需要flush才能将消息发送出去,代码如下。笔者很好奇为什么一定要分成write和flush两个方法——既然每次都需要调用flush,直接由框架自动去调用flush不就好了吗?于是就去看了源码,写此文记之。public void channelRead(Chann...

2019-07-13 15:17:24 2497

原创 netty ByteBuff 详解

本文参考:https://segmentfault.com/a/1190000015104849概要netty的ByteBuff是用来替代nio的ByteBuffer的,与nio的ByteBuffer相比有诸多优势,主要有以下几点:扩容问题ByteBuffer长度固定,分多了会浪费内存,分少了会数组越界。如果发现存储的数据大于ByteBuffer的长度,那么就需要创建一个新的Byt...

2019-07-13 12:09:14 1963 1

原创 Java内存模型和Volatile

Java内存模型为了提高代码的执行速度,Java内存模型中有两个优化方案:1、每个Java线程会有一个工作内存,工作内存中的内容会在一定条件下同步到主内存。为什么工作内存可以提高代码的执行速度?从硬件上来看CPU的速度>内存的速度。每次CPU去内存中读写数据的时候,CPU一般都是阻塞的,需要等内存执行完毕后CPU才会继续执行。Java工作内存可以认为是CPU高速缓存,那么就能避...

2019-06-29 18:20:53 440

原创 Java内存区域

概要近期看知乎脉脉上其他人对Java知识的讲解,发现自己居然连Java内存区域的各种内容都记不太清了。遍历博客文章的时候发现也没有这方面的记载,好像都记录在毕业前面试小本子上了。之后可能会开始捡起一写Java基础知识,也是温故而知新吧。本文参考《深入理解Java虚拟机》Java内存区域图图片摘自《深入理解Java虚拟机》Java内存主要区域:程序计数器虚拟机栈本地方法栈...

2019-06-29 15:50:19 314

原创 ios wkwebview uiwebview流程图

概要当前开发涉及ios webview知识,其各方法的执行流程会经常用到,因此整理成了两张图供参考。wkwebview流程图uiwebview+NSURLProtcol 流程图uiwebview一般会和NSURLProtcol一起使用来实现离线资源的加载。...

2019-06-29 11:07:56 930

原创 netty实现 socket demo

概要近期学习netty,写了个socket简单demo作记录,也供新手参考。由于主要记录netty网络协议的使用,demo中并没有socket粘包和分包的处理,有兴趣的读者可以自己写下,理论可以参考笔者文章:Socket粘包和分包问题netty相关理论可以参考笔者文章:netty学习小结简介使用nodejs模拟客户端发送消息。netty中使用SocketInHandler和Dea...

2019-06-29 10:56:38 4153

onMeasure简单方法 完美解决ListView与ScollView!

近期做项目碰到ScrollView与Listview冲突的情况,查看了网上一些解决listview和scollView的冲突的方法,最终选择了重写onMeasure的方法来解决这个问题。 在此对各种方法做一个个人的总结评价。 主要的方法有四种: 1、手动设置ListView高度(比如把高度设置为200dp) 评价:特别简单无脑,但是大大提高了代码的耦合性,比较适合“图方便”的新手。 2、使用单个ListView的addHeaderView()方法(给listview设置顶部固定的一个view) 评价:比较简便的方法,但是如果顶部布局需要监听滑动事件,也不可取。 3、使用LinearLayout取代ListView(重写LinearLayout) 评价:完全可行,但是让一个LinearLayout来实现Listview的功能真的觉得好奇怪啊。 4、重写ListView的onMeasure() 评价:只需要写几行代码,轻松解决冲突问题。不仅降低代码耦合性,而且简单。唯一的缺点,可能就是理解需要花比较多的时间。

2016-05-22

残缺棋盘 android实现颜色填充

原“残缺棋盘”题目: 残缺棋盘是一个2^k*2^个方格的棋盘,其中恰有1个方格残缺。图中给出,其中残缺部分用阴影表示。 这样的棋盘称为"三格板",残缺棋盘问题就是用这四种三格板覆盖更大的残缺棋盘。再次覆盖中要求: (1)两个三格板不能重复。 (2)三格板不能覆盖残缺棋盘方格,但必须覆盖到其他所有的方格。 添加要求: 使用图形化界面实现颜色填充残缺棋盘

2016-05-17

实验四 常微分方程的数值解

实验一博客地址:http://blog.csdn.net/double2hao/article/details/51152843 实验二博客地址:http://blog.csdn.net/double2hao/article/details/51217356 实验三博客地址:http://blog.csdn.net/double2hao/article/details/51344145 【实验内容】 分别写出改进欧拉法与四阶龙格库塔求解的算法,编写成熟上机调试出结果,要求所编程序适用于任何一阶常微分方程的数值解问题,即能解决这一类问题,而不是某一个问题。 试验中以下列数据验证程序的正确性。 求 y'=-xy^2 y(0)=2 (0<=x<=5) 步长h=0.25

2016-05-11

实验三 数值积分(android)

实验二博客地址:http://blog.csdn.net/double2hao/article/details/51217356 实验一博客地址:http://blog.csdn.net/double2hao/article/details/51152843 一、实验内容 分别写出变步长梯形法和romberge法计算定积分的算法,编写程序上机调试出结果,要求所编程序适用于任何类型的定积分,即能解决这一类问题,而不是某一个问题。 试验中以下列数据验证程序的正确性。 求 (sinx)/x的积分,积分区间为[0,1]

2016-05-08

android图片轮播效果,RollViewPager的简单使用

图片轮播算是我们用的比较多的一个功能,我之前也写过类似的文章(http://blog.csdn.net/double2hao/article/details/48896297),但是说实话自己写并不是特别方便,而且往往bug会比较多。而在github上有一些大神专门写了viewpager的轮播框架并且开源,供大家学习参考,这篇博客就教大家如何简单地使用开源框架RollViewPager。 对RollViewPager有兴趣,或者希望更深入学习的可以直接去github下载源码学习:https://github.com/Jude95/RollViewPager

2016-05-06

android RecyclerView布局

android RecyclerView布局 博客地址 :http://blog.csdn.net/double2hao/article/details/51177594 笔者个人看法,RecyclerView只是一个对ListView的升级版,这个升级的主要目的是为了让这个view的效率更高,并且使用更加方便。 我们知道,ListView通过使用ViewHolder来提升性能。ViewHolder通过保存item中使用到的控件的引用来减少findViewById的调用,以此使ListView滑动得更加顺畅。但这种模式在listview中即使不使用也无妨。 换言之,在ListView中你不考虑复用的问题也可以,只是你牺牲了内存来方便了代码。但是RecyclerView就不允许你这么做了,你使用RecyclerView就意味着你一定要复用,而效果上其实和ListView+ViewHolder差不多。

2016-04-22

实验二 插值方法(android)

一、实验内容 分别写出拉格朗日插值法与牛顿插值法的算法,编写程序上机调试出结果,要求所编程序适用于在任何一组插值节点,即能解决这一类问题,而不是某一个问题。 试验中以下列数据验证程序的正确性。 已知下列函数表 X 0.56160 0.56280 0.56401 0.56521 Y 0.82741 0.82659 0.82577 0.82495 求X=0.5635时的函数值。

2016-04-22

android RecyclerView布局真的只是那么简单

RecyclerView是什么? 笔者个人看法,RecyclerView只是一个对ListView的升级版,这个升级的主要目的是为了让这个view的效率更高,并且使用更加方便。 我们知道,ListView通过使用ViewHolder来提升性能。ViewHolder通过保存item中使用到的控件的引用来减少findViewById的调用,以此使ListView滑动得更加顺畅。但这种模式在listview中即使不使用也无妨。 换言之,在ListView中你不考虑复用的问题也可以,只是你牺牲了内存来方便了代码。但是RecyclerView就不允许你这么做了,你使用RecyclerView就意味着你一定要复用,而效果上其实和ListView+ViewHolder差不多。

2016-04-18

android RecyclerView布局真的只是那么简单!

笔者个人看法,RecyclerView只是一个对ListView的升级版,这个升级的主要目的是为了让这个view的效率更高,并且使用更加方便。 我们知道,ListView通过使用ViewHolder来提升性能。ViewHolder通过保存item中使用到的控件的引用来减少findViewById的调用,以此使ListView滑动得更加顺畅。但这种模式在listview中即使不使用也无妨。 换言之,在ListView中你不考虑复用的问题也可以,只是你牺牲了内存来方便了代码。但是RecyclerView就不允许你这么做了,你使用RecyclerView就意味着你一定要复用,而效果上其实和ListView+ViewHolder差不多。

2016-04-18

实验一 直接法解线性方程组(android)

一、实验目的 掌握Guass列选主消去法,三角分解法解线性方程。 二、实验内容 分别写出Guass列选主元消去法,三角分解法的算法,编写程序上机调试出结果,要求所编程序适用于任何线性方程组问题,即能解决这一类问题,而不是某一个问题。 实验中以下列数据验证程序的正确性 1、Guass列选主元消去法 [2.5 2.3 -5.1][x1] [3.7] [5.3 9.6 1.5][x2]=[3.8] [8.1 1.7 -4.3][x3] [5.5] 2、Doolittle三角分解法 [ 2 10 0 -3 ] [-3 -4 -12 13] [ 1 2 3 -4 ] [ 4 14 9 -13]

2016-04-14

android 自定义控件(底部icon点击效果)

主要实现的功能: 1、在java代码中动态设置底部控件的icon和text。(搭配fragment的时候特别方便) 2、text点击时会加粗 3、封装成自定义控件,更加方便。 (考虑到新手可能不易理解,笔者代码没有多加功能) 把底部icon做成自定义控件的优势: 1、搭配fragment或者viewpager使用的时候更加方便,避免写过多重复性代码。 2、代码维护起来更加方便,比如要修改底部icon中的字体,直接在自定义控件的layout中修改就可以。 3、提高代码的可阅读性。

2016-04-08

android ContentResolver的使用(获取和修改联系人信息demo)

ContentProvider和ContentResolver永远是相对的,本章主要是讲ContentResolver的使用,当然是在android系统提供ContentProvider的情况下。 ContentProvider与ContentResolver概念上的东西的就不讲了,主要讲一下ContentResolver的作用以及使用方法。 ContentResolver的作用: 1、可以通过ContentResolver来获取android内部的数据,比如联系人信息、系统的多媒体信息、短信信息等等。 2、可以获取提供了ContentProvider的应用的数据。 ContentResolver的使用方法:(参考《疯狂Android讲义第三版》446面) 1、调用Context的getContentResolver()获取ContentResolver对象。 2、根据需要调用ContentResolver的insert(),delete(),updata(),query方法操作数据库。 3、为了操作系统提供的ContentResolver,需要了解该ContentProvider的Uri,以及该ContentProvider所操作的数据列的列名,可以通过查阅Android官方文档来获取这些信息。 笔者个人意见: 1、建议新手读者在学完SqLite之后再来学习ContentResolver的内容,ContentResolver的insert(),delete(),updata(),query四个操作数据库的方法均与SQLite中的相同。 2、ContentProvider的Uri,以及该ContentProvider所操作的数据列的列名都不需要死记硬背,需要用的时候查阅一下即可,新手此处最好能自己全部写一下,对ContentResolver的使用有一个总体的了解。

2016-04-07

android canvas\paint\path简单使用(自定义view必学)

最近学到自定义view,也是涉及到了canvas、paint、path的使用,此内容比较简单。 此三者一般会在自定义view的onDraw()中用到: canvas:决定view的布局(位置,画布颜色,形状) paint:决定view的属性(颜色,字体大小,风格) path:路径(path的用法深入比较复杂,此处由于是入门,就不多加阐述混淆新手了)

2016-04-01

android 滑动删除的listview(自定义view)

本篇文章算是对郭霖前辈的一篇文章的详述: 一方面是笔者自己尝试从demo中理解了一下自定义view,另一方面是笔者希望通过更详细的注释已经解说,能帮助新手更容易地理解自定义view的使用。

2016-03-29

android Fragment与Activity交互,互相发数据(附图详解)

笔者近期看官方training,发现了很多有用又好玩的知识。其中,fragment与Activity通信就是一个。 fragment与Activity通信主要是两点: 1、fragment传递信息给Activity 此点是通过在fragment中定义接口与Activity共享数据。 2、Activity传递信息给fragment 此点主要是通过fragment的getArgument()和setArgument()两个函数传递bundle来传递。

2016-03-26

android Fragment与Activity互相发数据(附图详解)

笔者近期看官方training,发现了很多有用又好玩的知识。其中,fragment与Activity通信就是一个。 fragment与Activity通信主要是两点: 1、fragment传递信息给Activity 此点是通过在fragment中定义接口与Activity共享数据。 2、Activity传递信息给fragment 此点主要是通过fragment的getArgument()和setArgument()两个函数传递bundle来传递。

2016-03-25

android Activity的启动模式 作用简析+demo详解

笔者近期做的一个项目用到了Activity的启动模式,也算是第一次深刻地领会到了其强大与方便。在此也是将自己所得与大家分享,自己写了一个比较简易的demo,便于让大家理解。 此篇博客意在让对启动模式不了解的开发者对其有一个较为形象的认识,至于深入探究,笔者还是推荐去看任玉刚前辈所写的《android开发艺术探索》了。 网上对Activity的启动模式讲解的博客有很多,但是大部分都需要掌握“栈”的知识,而且很多并不是那么通俗易懂。笔者打算独辟蹊径,一方面通过百度地图讲其作用,另一方面通过自己写的demo演示来讲解4种启动模式。

2016-03-19

学生宿舍管理系统 学生宿舍管理系统

【题目】学生宿舍管理系统 考查点:线性结构、文件操作 注意:必须使用文件存储数据,不得使用数据库管理系统。 任务:通过此系统可以实现如下功能: 录入: 可以录入宿舍情况,包括宿舍号、可容纳学生数、已容纳学生数、男生/女生宿舍等信息; 可以录入学生住宿情况,包括学号、姓名、性别、宿舍号等信息。 其他信息可以自行设计。 分配宿舍:为每一个学生分配入一个未住满的宿舍。能否提供一个智能分配算法?推荐选择?批量分配?鼓励创新。 调换宿舍:实现一个学生调换宿舍操作以及两个同性学生互换宿

2016-03-04

C++ 中文API文档

C++ 中文API文档

2016-03-04

android nextFocus使用详解

近期在学习android官方sample,学习到nextFocus的时候花了一些时间,并且也是觉得比较有用,所以拿出来分享。 效果:

2016-02-26

Android单元测试-对Activity的测试 [

前提概要 上一篇文章已经介绍了单元测试的作用和简单示例,如果不了解的读者可以先阅读上一篇 Android单元测试-作用以及简单示例。 这篇文章主要介绍常见的Activity中的测试。 对Acitivity的测试(源码在文章结尾) 对于Activity,我们大致有两种测试需求: 1、在Activity正常启动后,查看界面布局是否正确,包括View的点击事件等是否正确。 2、需要在Activity启动前完成各种数据的部署,然后查看Activity的效果。 对于这两种需求,笔者分别做了两个示例解说: 1、检测一个布局中的button和TextView是否正确。 2、从网络动态获取String到Activity界面显示,并且这个图片的URL是由Intent传递过来的。

2017-08-15

Android单元测试-对Activity的测试

#前提概要 上一篇文章已经介绍了单元测试的作用和简单示例,如果不了解的读者可以先阅读上一篇[ Android单元测试-作用以及简单示例](http://blog.csdn.net/double2hao/article/details/77159380)。 这篇文章主要介绍常见的Activity中的测试。 #对Acitivity的测试 对于Activity,我们大致有两种测试需求: 1、在Activity正常启动后,查看界面布局是否正确,包括View的点击事件等是否正确。 2、需要在Activity启动前完成各种数据的部署,然后查看Activity的效果。 对于这两种需求,笔者分别做了两个示例

2017-08-14

ListView异步创建View

异步创建View这种操作一般情况下是用不到的,包括笔者之前自学阶段也是闻所未闻。 这定然是突破了我们一般编程的思维——UI操作难道不是只能在UI线程中吗? 是的,UI操作只能在UI线程中,但是UI控件的操作却是可以异步执行的。 考虑一下以下需求: > 我们要展示一个ListView,ListView中的数据和布局都是我们网络获取的,我们预先并不知道。 以往的我们使用一个Listview一般都是为了展示一类布局相同的信息,这种情况下,我们可以通过adapter的getView()方法中的convertView来实现View的复用,使View不用反复创建。

2017-07-14

FragmentTransaction使用全解

#前言 之前已经写过用Fragment做主界面以及Fragment与Activity通信的文章。两篇文章如下: [ndroid viewpager+fragment做主界面(超容易理解的demo!)](http://blog.csdn.net/double2hao/article/details/50450377) [android Fragment与Activity交互,互相发数据(附图详解)](http://blog.csdn.net/double2hao/article/details/50983820) 对于Fragment还剩FragmentTransaction没有具体讲到,此篇文章就讲一下FragmentTransaction的主要用法,也是对之前的回顾。

2017-03-03

用Scroller完成一个简单的ViewPager

#涉及知识点 ##onMeasure和onLayout 此点若不了解可以参考郭霖前辈的文章: [ Android视图绘制流程完全解析,带你一步步深入了解View(二)](http://blog.csdn.net/guolin_blog/article/details/16330267) ##事件分发机制 此点可以参考笔者文章: [完全理解android事件分发机制](http://blog.csdn.net/double2hao/article/details/54374861) ##scrollTo和scrollBy **scrollTo:**以View的初始位置为起点进行移动 **scrollBy:**以View的当前位置为起点进行移动 ##TouchSlop 系统可以识别出的被认为是滑动的最小距离。如果大于这个距离则是滑动。 ##View.getScrollX() getScrollX()获取到的值是屏幕的最左侧在整个空间中所占位置的X值。 打个比方:View是一条6米的绳子,而屏幕只能看到2~4米的绳子。那么getScrollX()的值就为2。如果屏幕看到的是3~5米的绳子,那么getScrollX()的值就为3。 ##Scroller Scroller的使用主要为3步: 1、初始化Scroller 2、重写computeScroll()方法 computeScroll()是在View的draw的时候调用的,而invalidate会导致View重绘,所以在重写computeScroll()之后,我们要使用invalidate()来间接调用它。 过程为:invalidate()->draw()->computeScroll() 3、使用startScroll()开启滑动

2017-02-23

完全理解android事件分发机制

#前言 之前笔者其实已经写过事件分发机制的文章:[快速理解android事件传递拦截机制概念](http://blog.csdn.net/double2hao/article/details/51541061) 但是,现在看来其实更像是一篇知识概括,多出可能未讲清楚,于是打算重写事件分发,用一篇文章大致讲清楚。 首先,形式上笔者最先思考的是使用源码,此者能从原理上讲解分发机制,比起侃侃而谈好得多。但是源码的复杂往往会让新手产生畏惧难以理解,于是笔者最终还是打算使用实例log来让读者理解android事件分发。 #重要函数 笔者此次主要提及最常用的几个函数: (其间区别看源码很容易理解,此处直接给上结果) **onClick():**这个函数是是View提供给我们的OnClickListener这个接口中的函数,在这里可以自定义对点击事件的处理逻辑。会在onTouchEvent()中进行调用。 **onTouch():**这个函数是View提供给我们的OnTouchListener这个接口中的函数,在这里面可以自定义对触摸事件的处理逻辑。 **onTouchEvent():**这个函数是view内部的触摸事件的处理方式,其间包括获取焦点,调用onClick()等等。 **dispatchTouchEvent():**这个是View的事件分发函数,在ViewGroup中进行重写。在View中其间会调用onTouchEvent(),在ViewGroup中其间会调用onInterceptTouchEvent()和onTouchEvent()。 **onInterceptTouchEvent():**这个函数是事件拦截函数,是ViewGroup才有的函数。

2017-01-12

ASP.NET 电影票信息的增删查改

##题目 1、使用Code First技术创建一个Movie数据模型。 ``` public class Movie { public int ID { get; set; } //电影编号 public string Title { get; set; } //电影名称 public DateTime ReleaseDate { get; set; } //上映时间 public string Genre { get; set; } //电影类型 public decimal Price { get; set; } //电影票价 public string Rating { get; set; } //电影分级 } ``` 2、使用MVC相关技术实现数据的列表显示和新增功能。 3、完成数据的编辑、删除、明细和条件查询等功能。 4、完成如下查询: (1)查询尚未上映电影的信息 (4)查询票价在某个区间的电影信息

2016-12-14

ASP.NET 个人信息注册页面,并跳转显示

#题目 新建一个MVC项目,利用HTML、CSS、JS、jQuery、Ajax、jQuery UI等技术设计一个个人信息注册页面。当点击“提交”按钮时,跳转到新的页面显示录入信息。 **基本要求:** 用户名为6-10个小写字母(小写使用正则式验证,且用户名不能为“wustzz” –用Ajax技术来检测);密码为6位数字,确认密码不一致时有提示;籍贯使用级联(jquery实现);Email必须符合Email格式;手机是11位(假设规定以1569开头);出生年月使用jQuery UI日历组件设置;图片要传递到新的页面显示。

2016-11-23

android socket聊天室——也不仅仅是聊天室

#前提概要 笔者很久之前其实就已经学习过了socket,当然也是用socket做过了聊天室,但是觉得此知识点比较一般,并无特别难的技术点,于是也并未深究。 然而近期一个项目中对socket的使用却让笔者感觉socket强大无比,可以实现诸多功能。 #个人Socket体验 项目主要有关智能家居,需要实现多台手机同时对灯进行操作(开或者关),主要需要实现以下几点: 1、进入界面时获取所有灯的状态。 2、一台手机改变了灯的状态,其他的手机上可以有所显示。 3、硬件上改变了灯的状态(手动开关灯),所有手机上要有所显示。 此功能如果使用HTTP读取的方式实现就不太合适了。一方面客户端与服务器读取文件的同步性难以保证,即使保证了,也需要浪费大量性能;另一方面,类似笔者的这种项目功能服务器和客户端交互比较频繁,对“即时性”要求也比较高,用HTTP不仅性能消耗太大,而且难以保证“即时性”。 但是使用Socket就很容易实现了,主要逻辑如下: 1、每次进入界面与服务器建立Socket连接,并得到此时灯的状态 2、每次需要对灯进行操作的时候建立一个线程把灯的状态传递给服务器,服务器接收到之后,把该状态传递给每一个此时与服务器建立连接的客户端。

2016-11-21

android 实现FlowLayout 流线布局(自定义ViewGroup)

#项目目的 1、深化自定义View的概念 2、将MeasureSpec、View的绘制流程、Layoutparams等分散的知识点整合成一个demo。 #项目灵感 笔者经验也是有限,此文章主要借鉴张鸿洋前辈的博客。 原文地址:http://blog.csdn.net/lmj623565791/article/details/38352503 #项目预览 ![这里写图片描述](http://img.blog.csdn.net/20161018184251886) #主要涉及知识点以及相关链接 ###1、MeasureSpec [快速理解android View的测量onMeasure()与Mea

2016-10-18

为RecyclerView添加分页加载(上拉加载更多)功能

上一篇文章已经介绍了如何为RecyclerView添加FootView,在此基础上,要添加分页加载的功能其实已经很简单了。 上一篇文章地址:[为RecyclerView添加FootView和HeadView](http://blog.csdn.net/double2hao/article/details/52787975)

2016-10-11

为RecyclerView添加FootView和HeadView

上一篇文章已经介绍过了RecyclerView的基本使用方法,原文如下:[android RecyclerView布局真的只是那么简单!](http://blog.csdn.net/double2hao/article/details/51177594)此篇文章算是对RecyclerView更深使用的介绍。 FootView和HeadView在ListView中的本身就有相对应的函数,但是在新潮的RecyclerView中却没有了,FootView在分页加载(上拉在家更多)中起着很重要的作用,因此也必须要学习一下了。(HeadView的添加与FootView的添加相比大致一样,在此就只讲FootView的添加了)

2016-10-11

学生信息管理系统2222

#设计目的 1、网上很少有关于SQLite简单综合项目的测试APP。 2、把自己所学的部分UI综合一下,希望能给新手一些帮助。 #涉及知识点 1、包括SQLite的增删查找等功能。 2、RecyclerView展示 3、SharedPreference保存密码,以及判别是否是第一次安装APP。(如果是第一次就录入测试数据) 4、简单的Menu操作

2016-09-23

最简易的网络框架封装(新手可看)

网络通信在Android上的重要性就不多说了。 demo就是获取到“https://www.baidu.com/”的HTML代码后显示在textview中。 如果仅仅实现这个功能需要的java代码绝对在10行以下,但是本片主要是讲一下简易框架的封装。 封装目的: 1、在同一个项目中,我们要执行网络操作可定不想要每次都编写一遍HTTP请求的代码。通常情况我们都会将这些网络操作提取到一个公共的类里面,并提供一个静态方法,

2016-09-07

从零开始写一个简单的ImageLoader框架

从零开始写一个简单的ImageLoader框架

2016-08-12

给自定义View添加xml属性

笔者之前已经写过了一些自定义View的文章,在此对其也就不从头说起了,如有兴趣的读者可以看一下笔者的前两篇文章。 [android 自定义view的使用(最佳demo——返回标题栏)](http://blog.csdn.net/double2hao/article/details/50209249) [android 自定义控件(底部icon点击效果)](http://blog.csdn.net/double2hao/article/details/51093896) 笔者之前的文章中仅仅介绍了如何使用自定义View以及为什么要使用自定义View等等,但是在实际操作中,我们还是希望自定义View之后,直接能够在xml中就对其进行操作,如下图:

2016-08-04

快速入门android AIDL(开启多进程并进行通信)

为何要开启多进程?主要有两种情况: 一、一个应用由于自身需要采用多进程模式来实现。比如播放器之类,如果仅仅在service中运行会影响主线程的响应速度,很可能会造成ANR;如果仅仅在子线程中运行,一旦开启该线程的Activity被杀死后,线程也被杀死,无法实现后台运行效果,更加不合理。而如果在另外一个进程中使用service后台运行,就显得十分恰当了。 二、由于android对单个应用所使用的最大内存做了限制,为了加大一个应用可使用的内存,所以通过多进程来获取多份内存空间。 本篇文章demo重点: 1、开启多进程 2、两个进程之间使用AIDL进行通信

2016-06-10

RecyclerView超简单demo(局部更新取代ListView)

回顾上一篇写RecyclerView的博客(android RecyclerView布局真的只是那么简单!)。笔者比较具体地讲了一下自己对RecyclerView的理解,但是可能知识点比较杂乱,部分新手读者还是无法领会其意。正好笔者最近学习到“局部更新”的知识点,在此就再附上一个更简单的demo了。 为何要实现局部更新? 很简单,就是要提高效率。很多时候在一个列表中,我们只会修改一条item,如果直接使用notifyDataSetChanged(),未免显得有点浪费资源了。 如何实现的局部更新? 在RecyclerView出来之前,ListView如果要实现局部更新,首先要自定义一个ViewHolder,其次要自己写一个局部更新的函数。整体的流程算不上复杂,但是确实不是很方便,开发者们都会不由得想,为什么不直接官方就把这个写好啊。(ListView局部更新的例子在网上有很多,笔者在此处就不多加阐述了。) 然而,RecyclerView的出现就是帮了开发者们一个大忙了,RecyclerView.Adapter自带局部更新的函数,不需要自己写。

2016-06-08

实验五 迭代法解线性方程组与非线性方程(android)1

实验一博客地址:http://blog.csdn.net/double2hao/article/details/51152843 实验二博客地址:http://blog.csdn.net/double2hao/article/details/51217356 实验三博客地址:http://blog.csdn.net/double2hao/article/details/51344145 实验四博客地址:http://blog.csdn.net/double2hao/article/details/51372731 【实验内容】 分别写出高斯-赛德尔迭代法与牛顿迭代法的算法,编写程序上机调试出结果,要求所编程序适用于任何一个方程的求根,即能解决这一类问题,而不是某一个问题。 1、高斯-赛德尔迭代法求解线性方程组 [ 7 2 1 -2][x1] [ 4] [ 9 15 3 -2][x2] [ 7] [-2 -2 11 5][x3]=[-1] [1 3 2 13][x4] [ 0] 2、用牛顿迭代法求方程x^3-x-1=0的近似根,精确度<=0.00001,牛顿法的初始值为1.

2016-05-25

实验五 迭代法解线性方程组与非线性方程(android)

实验一博客地址:http://blog.csdn.net/double2hao/article/details/51152843 实验二博客地址:http://blog.csdn.net/double2hao/article/details/51217356 实验三博客地址:http://blog.csdn.net/double2hao/article/details/51344145 实验四博客地址:http://blog.csdn.net/double2hao/article/details/51372731 【实验内容】 分别写出高斯-赛德尔迭代法与牛顿迭代法的算法,编写程序上机调试出结果,要求所编程序适用于任何一个方程的求根,即能解决这一类问题,而不是某一个问题。 1、高斯-赛德尔迭代法求解线性方程组 [ 7 2 1 -2][x1] [ 4] [ 9 15 3 -2][x2] [ 7] [-2 -2 11 5][x3]=[-1] [1 3 2 13][x4] [ 0] 2、用牛顿迭代法求方程x^3-x-1=0的近似根,精确度<=0.00001,牛顿法的初始值为1.

2016-05-24

空空如也

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

TA关注的人

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