自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(52)
  • 资源 (1)
  • 问答 (1)

原创 异步任务串行解决方案

问题描述在业务开发时,有时不仅仅是拉取一个数据接口展示列表这么简单。举一个购买场景:第一步调用网络接口登录第二步调用网络接口购买第三步查询购买结果第四步调用DBApi将购买结果写入本地第五步向外回调结果这里所有的操作都是异步的,再举一个聊天业务场景的例子。当收到有新消息通知。需要拉取获取新消息的网络接口以获得新消息。有这样几步:拉取本地DBApi查询本地保持的最大消息Id,以...

2019-03-21 10:24:25 652

原创 深入理解Android Handler机制(深入至native层)

文章目录前言前置知识ThreadLocalThreadLocal使用ThreadLocal原理源码解读总结多路复用IOhandler工作原理概述工作原理架构流程Looperhandler构造消息分发发送消息移除消息MessageQueue创建MessageQueue循环消息enqueueMessagenative层的handler初始化阻塞唤醒其他handler为什么不会阻塞主线程?handler在Android源码中的应用后记前言handler作为Android中最重要的内容,需要相对透彻的理解,并非

2020-08-08 10:02:52 185

原创 对称/非对称加密、证书详细介绍、https加密通信、Android打包签名讲解

概述本文记录加密、签名、证书等基础知识。并梳理应用证书、加密方式的具体案例,如https加密、Android打包签名等内容基础知识加密算法加密算法主要有非对称加密和对称加密两种算法对称加密算法指的就是加密和解密使用同一个秘钥,所以叫做对称加密。对称加密只有一个秘钥,作为私钥。常见对称加密算法:DES,AES,3DES非对称加密非对称加密指的是:加密和解密使用不同的秘钥,一把作为公开的公钥,另一把作为私钥。公钥加密的信息,只有私钥才能解密。私钥加密的信息,只有公钥才能解密。 好多同学理

2020-07-11 09:51:39 78

原创 React State Props使用示例

前言感悟这几天撸React代码,在撸之前没有仔仔细细阅读官方文档,拿着功能需求按照以往其他语言编程经验及随用随查的API进行开发。发现这个过程是痛苦的,每百度一个简单的功能实现,都会耗费巨大的尽力和筛选有效信息时间,其实静下心来花费一定时间完整阅读官方文档很有必要,因为官方文档能够涵盖大部分开发场景。场景在理解了(我以为自己理解了)sate&props后,需要实现一个如下功能组件:...

2020-02-05 20:59:50 51

原创 小米 Android ACTION_UP不响应

问题概要在小米手机(测试机为小米4LTE)上,对一个TextView/Button设置OnTouchListener,长按View抬起时,并没有收到ACTION_UP时间,而是收到了ACTION_CANCEL事件。理论查阅资料,发现如下理论:当控件收到前驱事件(什么叫前驱事件?一个从DOWN一直到UP的所有事件组合称为完整的手势,中间的任意一次事件对于下一个事件而言就是它的前驱事件)之后,后...

2019-10-24 09:41:47 105

原创 Android蓝牙耳机/扬声器音频切换

需求背景要求某些场景已经插入耳机或连接了蓝牙耳机,需要使用扬声器播放音频实现调研有线耳机的情况排除蓝牙耳机情况,使用有线耳机,切换时只需要打开/关闭扬声器即可。这样就可以实现在插入耳机的情况下,使用扬声器播放。 代码如下://切换为扬声器AudioManager audioManager = (AudioManager) this.getSystemService(Context.AU...

2019-08-13 19:08:21 3978 2

原创 byte 16进制 2进制理解

十六进制以下内容参考博客:关于0x16进制概念以0x开始的数据表示16进制,计算机中每位的权为16(10进制的权为10),即(16进制)10 = (10进制)1×16。备注:这里的0是数字0,不是字母O!为什么需要十六进制编程中,我们常用的还是10进制……毕竟C/C++是高级语言。比如:int a = 100,b = 99;不过,由于数据在计算机中的表示,最终以二进制的形式存在,所...

2019-07-18 17:00:12 2196

原创 靠谱Android Studio JNI Demo

前言作为工作了近四年时间的Android开发,搞通这个Demo用了一个工作日,觉得自己动手能力有些差,所以记录下。这里我们不介绍JNI的基础理论知识。只讲Demo流程。Demo第一步创建Demo工程,从SDK Manager中下载NDK相关组件,同时将Support Repository也下载下来第二步创建Java文件,如下:package com.example.jnidemo;...

2019-06-17 19:56:36 96

原创 AS Gradle task构建失败CompilationFailedException解决

问题在编译运行项目时,会提示一些Task的错误,但并没有列出错误的具体原因。我们无法根据已有的提示找出错误所在。如下:org.gradle.api.tasks.TaskExecutionException: Execution failed for task ':module-risk-control:compileDebugJavaWithJavac'. at org.gradle.api...

2018-12-14 11:23:52 2442

原创 Java集合迭代器

迭代器模式定义就是提供一种方法对一个容器对象中的各个元素进行访问,而又不暴露该对象容器的内部细节。这意味着迭代器需要提供统一的接口。普通访问我们先来看下正常访问集合访问数组int array[] = new int[3]; for (int i = 0; i < array.length; i++) { System.out.println(array[i]);...

2018-11-26 17:05:08 81

原创 FreeMarker语法

FreeMarker语法概述FreeMarker Java使用FreeMarker语法数据结构注释访问值List相关循环listlist size判断下标判断if条件判断首字母大小写宏定义判空后记概述最近做公司一个需求,代码生成模板,编写用于生成Java Bean的ftl文件。在此记录下使用Freemarker的常用语法FreeMarker Java使用实例化FreeMarker配置类...

2018-11-22 20:03:59 168

原创 SQL select语句复习

内连接概念内连接,也被称为自然连接,只有两个表相匹配的行才能在结果集中出现。返回的结果集选取了两个表中所有相匹配的数据,舍弃了不匹配的数据。可以理解为取两个表的交集#语法select fieldlist from table1 [inner] join table2 on table1.column = table2.column举例A表| id | name ...

2018-11-07 19:35:21 113

原创 Alamofire+HandyJSON+泛型封装的简单离散式网络框架

离散式与集约式网络框架集约式:每个请求都会走统一的入口,对外暴露了请求的 URL 和 Param 以及请求方式,入口一般都是通过单例 来实现。例如HttpClient.getInstance().sendRequest(url,params,callback)优点:1、使用便捷,可以快速开发缺点:1、对每个请求的定制要求不够,例如,现在有个新需求,请求新闻条目需要保存...

2018-11-05 15:43:22 1609 2

原创 IOS TableViewl详解(两种Cell注册方式)

学习iOS第二周,学习到了比较重要的组件TableView,照着书上敲,没有实现效果。在同事的帮助下,有了比较清晰的理解,记录在此。我使用的完全是xib的方式。我们先按照这种方式来梳理出Demo先看下项目结构目录先从最简单的model开始看起,可以理解为javabean//// News.swift// HelloIOS//// Created by zxg o...

2018-09-28 08:32:29 3279

原创 Android studio Tab Placement设置

默认的Tab Placement有两个痛点。1·、能够显示的项目不多2、由于Tab Placement默认在top,所以能看到的类很少,这样,当修改很多文件需要来回切换时,及其不方便。截图如下:我们可以设置将tab Placement放置左边或右边,并调整可以打开文件的最大数目。这样当我们修改很多文件时,或跟踪代码时会很方便。效果图如下:修改方法:第一步,修改tab p...

2018-08-24 10:47:45 1062

原创 回溯法解01背包问题

关于回溯法的概念,这篇文章讲的比较通俗易懂:https://blog.csdn.net/jarvischu/article/details/16067319贴出阅读这篇文章后解决01背包问题的Java代码,注释中加入了自己的理解package com.zxg.algorithm.backtrack;/** * 回溯法解01背包问题 * 背包问题的概念不再赘述。这里主要讲解下回溯法...

2018-08-16 18:10:25 2396 2

原创 Git基本使用

Git简介    Git是一个开源的分布式版本控制工具,用于有效、高速地处理从小到非常大的项目版本管理,Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。    与集中式版本控制软件SVN相比,Git的分布式管理最大的区别在于它可以使开发者将代码提交到本地,每个开发者通过克隆(git clone),在本地机器上拷贝一个完整的Gi...

2018-07-30 16:11:59 75

原创 01背包问题Java(动态规划和暴力求解)

比较经典的一个问题,在理清思路之后,写出了代码。动态规划的思想还是将大的问题分解成小的的问题。或者说是分成小的步骤。例如在背包问题中,想求解背包容量为N的最大价值,先求解容量为N-1的最大价值,一步一步向前推,最终在返回来。自己也是理解了好久,突然有一天早上刷牙,就把问题想明白了。还是要多悟,多说无益,看代码:package com.zxg.algorithm.PackageQuestion...

2018-07-25 14:07:00 5187 1

转载 为什么wait,notify和notifyAll要与synchronized一起使用?

Object.wait(),Object.notify(),Object.notifyAll()都是Object的方法,换句话说,就是每个类里面都有这些方法。Object.wait():释放当前对象锁,并进入阻塞队列 Object.notify():唤醒当前对象阻塞队列里的任一线程(并不保证唤醒哪一个) Object.notifyAll():唤醒当前对象阻塞队列里的所有线程为什么这三个方...

2018-07-23 17:40:02 353

原创 算法练习:int数组,将其中正数负数各移到一边

刷题看到这样一道题,以前都会上网找别人的思路,现在尝试自己思考分析。解决思路:从左遍历数组,找到第一个为负数的元素,从右向左找到第一个为正数的元素,交换。其中需要维护一个end变量记录右边位置,需要注意的是,end必须大于i。代码如下:/** * 将数组中正负数调整到各自一边 */public class ArithmerticPractice_12 { public ...

2018-07-18 17:04:48 970

原创 百度面试经历之设计一个异步执行队列

面试官提出一个问题:设计一个异步执行的队列。我的第一想法是采用阻塞队列,提供向阻塞队列中添加任务的方法,提供启动任务队列中任务的方法,当时的思路比较模糊,在这里写一下。在代码中虽然使用了阻塞队列,但并没有使用阻塞队列的特性。基本上实现了面试官所要求的功能,代码如下public class AsyncRunnableQueue { private static class AsyncRunn...

2018-07-13 14:33:03 159

原创 百度Android面试经历之串行执行三个线程

接着上一篇内容,这次面试主要围绕多线程进行提问。接下来让我编程:串行执行三个线程,任务是每一个线程将i加1。我当时使用的是join()方法,但是由于对join()方法理解的不透彻。对自己的代码信心不大。我在这再写一遍:public class SerialDemo { public static void main(String[] args) throws InterruptedExce...

2018-07-12 19:41:10 823

原创 百度Android面试题之如何停止一个线程

前段时间去面试了百度android职位,虽然没有通过,但是发现了很多自己的不足,回来痛定思痛,决定将所有的面试题整理到CSDN上,查漏补缺。问:如何停止一个线程?由于平时不怎么写多线程,所以直接说了个interrupt()显然是不对的。那么接下来我们探讨一下java中如何停止一个线程。Thread.stop()该方法已经不推荐使用,它不能保证安全的退出线程,这里不讨论。interrupt()方式我...

2018-07-12 17:56:40 1057

原创 onCreate()中getHeight()获取不到高度的原因(源码分析)

问题在Activity的周期方法onCreate()调用getHeight()为什么返回值为0?那在onResume()方法中可以获取到吗?那调用getMeasureHeight()可以获取到值吗?我们从源码分析一下。Activity启动简述其实,这里就涉及到Activity启动流程的问题,要点就是Activity.onCreate()/onStart()/onResume()等生命周期方法和vi...

2018-07-01 18:11:47 609

原创 Android GreenDao数据库升级数据迁移

概述之前数据库升级,做法是删除旧表新建新表,这样所有的数据均被删除,那么一些私有数据,例如用户登录信息也被删除。这样的用户体验很不好,用户更新APP后,需要重新登录。为改进用户体验,我们将用户私有数据做迁移。这样用户不需要重新登录。设计方案总体设计方案如下:1、创建临时表存储旧表数据2、删除旧表3、创建新表4、将旧表数据迁移至新表在迁移时需要考虑一个问题:若新表的表结构有变化如何处理?在代码中我们...

2018-06-28 21:06:02 572

原创 TCP与UDP协议的区别与应用

概述TCP与UDP协议均是网络框架中运输层的协议,TCP是有连接的,在正式进行数据传输之前,客户端会与服务端通过三次握手进行连接。并且TCP提供更可靠的数据传输服务。所谓可靠,是因为TCP协议实现了一些例如重连、确认、窗口、重传、拥塞控制等机制保证数据传输的可靠性,不会出现丢包现象。UDP是无连接的,没有像TCP一样的确保数据传输成功的机制UDP(User Datagram Protocol) U...

2018-06-28 17:48:19 206

转载 Java不可重入锁和可重入锁理解

最近正在阅读Java ReentrantLock源码,始终对可重入和不可重入概念理解不透彻,进行学习后记录在这里。基础知识Java多线程的wait()方法和notify()方法这两个方法是成对出现和使用的,要执行这两个方法,有一个前提就是,当前线程必须获其对象的monitor(俗称“锁”),否则会抛出IllegalMonitorStateException异常,所以这两个方法必须在同步...

2018-06-28 15:30:35 50506 23

原创 Android异步加载方案

Android的Lazy Load主要体现在网络数据(图片)异步加载、数据库查询、复杂业务逻辑处理以及费时任务操作导致的异步处理等方面。在介绍Android开发过程中,异步处理这个常见的技术问题之前,我们简单回顾下Android开发过程中需要注意的几个地方。Android应用开发过程中必须遵循单线程模型(Single Thread Model)的原则。因为Android的UI操作并不是线程安全的,...

2018-06-27 15:59:31 237

原创 Java单链表:输入两个有序链表合成为一个有序链表(最笨的办法)

一个比较常见的算法题:合并两个已知排序的单链表,合并后保持有序。网上有很多解法,都是什么所谓的并轨排序,将一个链表合并插入到另一个链表中。自己想出个最笨的方法,维护第三个resultSingleLink。从两个输入的链表中取值比较并插入到resultSingleLink中。先看下我定义的SingleLink,其中提供了很多API方便调用,顺便可以复习一下单链表写法。如下:/** * Create...

2018-06-23 16:23:08 678

原创 Java线程池原理分析

Java虚拟机启动一个新线程的成本比较高,当程序中需要启动大量且生存期很短暂的线程时,可以考虑使用线程池。Java为我们提供了四种线程池使用。1)创建单个线程的线程池ExecutorService threadPool = Executors.newSingleThreadExecutor()2)创建多个线程的线程池ExecutorService threadPool = Executors.ne...

2018-06-22 10:59:13 146

原创 Java虚拟机类加载机制

本篇文章为阅读《深入理解java虚拟机》第二步笔记类加载阶段    类从被加载到虚拟机内存中开始,到卸载出内存为止,整个生命周期包括加载(Loading)、验证(Verification)、准备(Preparation)、解析(Resolution)、初始化(Initalization)、使用(Using)、卸载(Unloading)7个阶段,其中验证、准备、解析3个部分统称为链接(Linking...

2018-06-20 14:05:52 67

原创 Android应用功能开发之计时锁屏

需求描述    在开发金融类APP时,经常会有这样一种需求,超过时间限制未操作页面,需要页面回到密码登录页,一般是回到手密页,那我们如何实现这样一种需求呢?方案设计    APP跑起来之后,我们一定会有一种类似Manager的角色,它是单例的且与APP生命周期相同的一直跑在内存中。它的作用是管理业务,串联业务流程,启动页面等。我们可以单独做一个TouchTimeoutManager作为计时器,每隔...

2018-06-15 15:24:03 1712

原创 Android开发抽象状态机

前言            在Android APP开发过程中,有时可以采用状态机来解决某些复杂业务,例如下拉刷新功能,我们可以更加行为将其划分为Normal状态、Pull状态、Loading状态,根据不同的状态我们实现该状态下行为。例如Loading状态下我们需要显示loading图标。Pull(下拉)状态下我们要计算下拉距离等等。这篇文章我们一起探讨编写一个抽象状态机,在业务模块可以继承抽象状...

2018-06-13 13:42:32 78

原创 状态模式及java实现

定义    定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它的类。应用场景  1.一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为。  2.一个操作中含有庞大的多分支的条件语句,且这些分支依赖于该对象的状态。这个状态通常用一个或多个枚举常量表示。 通常,有...

2018-06-13 10:17:35 925

原创 浅谈Android java层ServiceManager

概述ServiceManager作为Android进程间通信binder机制中的重要角色,运行在native层,由c++语言实现,任何Service被使用之前,例如播放音乐的MediaService,例如管理activity的ActivityManagerService,均要向SM注册,同时客户端使用某个service时,也需要向ServiceManager查询该Service是否注册过了。Ser...

2018-06-08 15:08:40 1891

原创 Android Service使用方法回顾

    Service作为Android四大组件之一,承载着重要的作用,同时,熟悉Service也会为理解Binder打下重要的基础,这里是我初学Android时做的关于Service的笔记,现在总结到这篇文章中。概述android中的service与Windows中的服务类似,一般没有用户界面,运行在后台,可以执行耗时的操作,是安卓四大组件之一。其他组件可以启动service,并且当用户切换另外...

2018-06-07 21:09:18 170

原创 Android SystemServer解析

概述    理解该文章,需要阅读者对Android进程间通信方式Binder有一定了解,理解Binder的方式之一便是找到一个系统中binder通信的例子,例如activity启动过程,该过程描述了应用进程的activity和系统进程,准确的说是SystemServer进程中的ActivityManagerService通信。其实,SystemServer进程中不仅仅运行着AMS,还运行着其他各种...

2018-06-07 16:38:14 3002

原创 单例模式

定义    单例模式确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例。理解    在计算机系统中,线程池、缓存、日志对象、对话框、打印机、显卡的驱动程序对象常被设计成单例。这些应用都或多或少具有资源管理器的功能。每台计算机可以有若干个打印机,但只能有一个Printer Spooler,以避免两个打印作业同时输出到打印机中。每台计算机可以有若干通信端口,系统应当集中管理这些通信端口,以...

2018-06-07 15:25:09 47

原创 代理模式与java动态代理

定义    代理(Proxy)是一种设计模式,提供了对目标对象另外的访问方式;即通过代理对象访问目标对象.这样做的好处是:可以在目标对象实现的基础上,增强额外的功能操作,即扩展目标对象的功能。有点类似于装饰者模式。但是与装饰者模式的区别是代理模式最终不一定调用目标对象的目标方法。但装饰者一定会。图示:理解:    通俗一点说,就是代理对象持有目标对象的引用,并对外提供所有目标对象的业务方法,在该方...

2018-06-06 11:11:43 110

原创 初探Retrofit使用方法

概念Retrofit框架是Square公司出品的网络框架,效率快、实现简单。运用注解和动态代理,极大简化网络请求繁琐步骤特点    性能好、处理快,使用简单;默认使用okhttp处理网络请求;默认使用Gson解析。常用注解接口    Retrifit采用注解方式标注方法,常用接口如下:@GET:GET网络请求方式@POST:POST网络请求方式GET请求相关:@Headers:头参数信息@Path...

2018-06-05 16:28:01 78

个人总结的ios编码规范

个人总结的iOS编码规范,有利于提高代码可读性和可维护性

2018-09-11

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