- 博客(55)
- 资源 (1)
- 问答 (1)
- 收藏
- 关注
原创 异步任务串行解决方案
问题描述在业务开发时,有时不仅仅是拉取一个数据接口展示列表这么简单。举一个购买场景:第一步调用网络接口登录第二步调用网络接口购买第三步查询购买结果第四步调用DBApi将购买结果写入本地第五步向外回调结果这里所有的操作都是异步的,再举一个聊天业务场景的例子。当收到有新消息通知。需要拉取获取新消息的网络接口以获得新消息。有这样几步:拉取本地DBApi查询本地保持的最大消息Id,以...
2019-03-21 10:24:25 2291 1
原创 Dart语言中的Isolate
概述Dart本身是Google推出的web开发语言,所以Dart语言在设计上很多方面都借鉴了JS。例如JS的面向对象、单线程、事件循环等。同时也做了许多优化,比如JavaScript低效的解释执行,而Dart可以在运行前直接编译为机器码,提高了执行效率,这个过程叫做AOT(Ahead of time)。还有JavaScript的单线程模型,只能依赖JS解释引擎的异步任务执行机制,开发者没有办法自己启动新的线程去执行耗时代码,但是Dart却提供了这个能力 — Isolate。Isolate是一种特殊的线程,
2021-05-07 16:26:25 773 2
原创 Flutter引擎介绍
概述本文讨论Flutter的引擎架构。在整个flutter系统中,引擎位于承上启下的中间位置。上层承接flutter framewrok。下层是与原生平台对接的嵌入层(Embedder)。本文讨论Flutter的引擎架构。在整个flutter系统中,引擎位于承上启下的中间位置。上层承接flutter framewrok。下层是与原生平台对接的嵌入层(Embedder)flutter系统概述这里简单讲一下flutter系统的整体分层架构framework提供直接面对开发者的组件页面的API,封
2021-05-07 16:25:16 2485 2
原创 买房准备之交易流程学习
概述经过某乎的了解以及向已买房同学的请教,对上海二手房产的交易流程有了大概的认知,现总结如下。流程图注意事项及风险事务1需要注意最好在谈拢价格后,向卖方索要产调报告,以确保了解房屋产权是否清晰、抵押情况如何等情况后,再向对方支付定金需要注意在确定购买意向及支付定金后,卖家产权证应该交于中介保管定金在支付首付时直接抵扣响应数额,一般来说定金是5W事务2支付首付时一般通过银行卡转账,银行APP中会有电子回执单。同时也需要卖方提供手写签名的收据通过网上了解,存在第三方
2020-12-04 18:53:31 487
原创 深入理解Android Handler机制(深入至native层)
文章目录前言前置知识ThreadLocalThreadLocal使用ThreadLocal原理源码解读总结多路复用IOhandler工作原理概述工作原理架构流程Looperhandler构造消息分发发送消息移除消息MessageQueue创建MessageQueue循环消息enqueueMessagenative层的handler初始化阻塞唤醒其他handler为什么不会阻塞主线程?handler在Android源码中的应用后记前言handler作为Android中最重要的内容,需要相对透彻的理解,并非
2020-08-08 10:02:52 2025
原创 对称/非对称加密、证书详细介绍、https加密通信、Android打包签名讲解
概述本文记录加密、签名、证书等基础知识。并梳理应用证书、加密方式的具体案例,如https加密、Android打包签名等内容基础知识加密算法加密算法主要有非对称加密和对称加密两种算法对称加密算法指的就是加密和解密使用同一个秘钥,所以叫做对称加密。对称加密只有一个秘钥,作为私钥。常见对称加密算法:DES,AES,3DES非对称加密非对称加密指的是:加密和解密使用不同的秘钥,一把作为公开的公钥,另一把作为私钥。公钥加密的信息,只有私钥才能解密。私钥加密的信息,只有公钥才能解密。 好多同学理
2020-07-11 09:51:39 736
原创 React State Props使用示例
前言感悟这几天撸React代码,在撸之前没有仔仔细细阅读官方文档,拿着功能需求按照以往其他语言编程经验及随用随查的API进行开发。发现这个过程是痛苦的,每百度一个简单的功能实现,都会耗费巨大的尽力和筛选有效信息时间,其实静下心来花费一定时间完整阅读官方文档很有必要,因为官方文档能够涵盖大部分开发场景。场景在理解了(我以为自己理解了)sate&props后,需要实现一个如下功能组件:...
2020-02-05 20:59:50 211
原创 小米 Android ACTION_UP不响应
问题概要在小米手机(测试机为小米4LTE)上,对一个TextView/Button设置OnTouchListener,长按View抬起时,并没有收到ACTION_UP时间,而是收到了ACTION_CANCEL事件。理论查阅资料,发现如下理论:当控件收到前驱事件(什么叫前驱事件?一个从DOWN一直到UP的所有事件组合称为完整的手势,中间的任意一次事件对于下一个事件而言就是它的前驱事件)之后,后...
2019-10-24 09:41:47 699
原创 Android蓝牙耳机/扬声器音频切换
需求背景要求某些场景已经插入耳机或连接了蓝牙耳机,需要使用扬声器播放音频实现调研有线耳机的情况排除蓝牙耳机情况,使用有线耳机,切换时只需要打开/关闭扬声器即可。这样就可以实现在插入耳机的情况下,使用扬声器播放。 代码如下://切换为扬声器AudioManager audioManager = (AudioManager) this.getSystemService(Context.AU...
2019-08-13 19:08:21 13593 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 11720
原创 靠谱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 267
原创 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 3836 1
原创 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 261
原创 FreeMarker语法
FreeMarker语法概述FreeMarker Java使用FreeMarker语法数据结构注释访问值List相关循环listlist size判断下标判断if条件判断首字母大小写宏定义判空后记概述最近做公司一个需求,代码生成模板,编写用于生成Java Bean的ftl文件。在此记录下使用Freemarker的常用语法FreeMarker Java使用实例化FreeMarker配置类...
2018-11-22 20:03:59 627
原创 SQL select语句复习
内连接概念内连接,也被称为自然连接,只有两个表相匹配的行才能在结果集中出现。返回的结果集选取了两个表中所有相匹配的数据,舍弃了不匹配的数据。可以理解为取两个表的交集#语法select fieldlist from table1 [inner] join table2 on table1.column = table2.column举例A表| id | name ...
2018-11-07 19:35:21 345
原创 Alamofire+HandyJSON+泛型封装的简单离散式网络框架
离散式与集约式网络框架集约式:每个请求都会走统一的入口,对外暴露了请求的 URL 和 Param 以及请求方式,入口一般都是通过单例 来实现。例如HttpClient.getInstance().sendRequest(url,params,callback)优点:1、使用便捷,可以快速开发缺点:1、对每个请求的定制要求不够,例如,现在有个新需求,请求新闻条目需要保存...
2018-11-05 15:43:22 2734 3
原创 IOS TableViewl详解(两种Cell注册方式)
学习iOS第二周,学习到了比较重要的组件TableView,照着书上敲,没有实现效果。在同事的帮助下,有了比较清晰的理解,记录在此。我使用的完全是xib的方式。我们先按照这种方式来梳理出Demo先看下项目结构目录先从最简单的model开始看起,可以理解为javabean//// News.swift// HelloIOS//// Created by zxg o...
2018-09-28 08:32:29 5413
原创 Android studio Tab Placement设置
默认的Tab Placement有两个痛点。1·、能够显示的项目不多2、由于Tab Placement默认在top,所以能看到的类很少,这样,当修改很多文件需要来回切换时,及其不方便。截图如下:我们可以设置将tab Placement放置左边或右边,并调整可以打开文件的最大数目。这样当我们修改很多文件时,或跟踪代码时会很方便。效果图如下:修改方法:第一步,修改tab p...
2018-08-24 10:47:45 1730
原创 回溯法解01背包问题
关于回溯法的概念,这篇文章讲的比较通俗易懂:https://blog.csdn.net/jarvischu/article/details/16067319贴出阅读这篇文章后解决01背包问题的Java代码,注释中加入了自己的理解package com.zxg.algorithm.backtrack;/** * 回溯法解01背包问题 * 背包问题的概念不再赘述。这里主要讲解下回溯法...
2018-08-16 18:10:25 4913 2
原创 Git基本使用
Git简介 Git是一个开源的分布式版本控制工具,用于有效、高速地处理从小到非常大的项目版本管理,Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。 与集中式版本控制软件SVN相比,Git的分布式管理最大的区别在于它可以使开发者将代码提交到本地,每个开发者通过克隆(git clone),在本地机器上拷贝一个完整的Gi...
2018-07-30 16:11:59 205
原创 01背包问题Java(动态规划和暴力求解)
比较经典的一个问题,在理清思路之后,写出了代码。动态规划的思想还是将大的问题分解成小的的问题。或者说是分成小的步骤。例如在背包问题中,想求解背包容量为N的最大价值,先求解容量为N-1的最大价值,一步一步向前推,最终在返回来。自己也是理解了好久,突然有一天早上刷牙,就把问题想明白了。还是要多悟,多说无益,看代码:package com.zxg.algorithm.PackageQuestion...
2018-07-25 14:07:00 6899 1
转载 为什么wait,notify和notifyAll要与synchronized一起使用?
Object.wait(),Object.notify(),Object.notifyAll()都是Object的方法,换句话说,就是每个类里面都有这些方法。Object.wait():释放当前对象锁,并进入阻塞队列 Object.notify():唤醒当前对象阻塞队列里的任一线程(并不保证唤醒哪一个) Object.notifyAll():唤醒当前对象阻塞队列里的所有线程为什么这三个方...
2018-07-23 17:40:02 550
原创 算法练习:int数组,将其中正数负数各移到一边
刷题看到这样一道题,以前都会上网找别人的思路,现在尝试自己思考分析。解决思路:从左遍历数组,找到第一个为负数的元素,从右向左找到第一个为正数的元素,交换。其中需要维护一个end变量记录右边位置,需要注意的是,end必须大于i。代码如下:/** * 将数组中正负数调整到各自一边 */public class ArithmerticPractice_12 { public ...
2018-07-18 17:04:48 1772
原创 百度面试经历之设计一个异步执行队列
面试官提出一个问题:设计一个异步执行的队列。我的第一想法是采用阻塞队列,提供向阻塞队列中添加任务的方法,提供启动任务队列中任务的方法,当时的思路比较模糊,在这里写一下。在代码中虽然使用了阻塞队列,但并没有使用阻塞队列的特性。基本上实现了面试官所要求的功能,代码如下public class AsyncRunnableQueue { private static class AsyncRunn...
2018-07-13 14:33:03 305
原创 百度Android面试经历之串行执行三个线程
接着上一篇内容,这次面试主要围绕多线程进行提问。接下来让我编程:串行执行三个线程,任务是每一个线程将i加1。我当时使用的是join()方法,但是由于对join()方法理解的不透彻。对自己的代码信心不大。我在这再写一遍:public class SerialDemo { public static void main(String[] args) throws InterruptedExce...
2018-07-12 19:41:10 1271
原创 百度Android面试题之如何停止一个线程
前段时间去面试了百度android职位,虽然没有通过,但是发现了很多自己的不足,回来痛定思痛,决定将所有的面试题整理到CSDN上,查漏补缺。问:如何停止一个线程?由于平时不怎么写多线程,所以直接说了个interrupt()显然是不对的。那么接下来我们探讨一下java中如何停止一个线程。Thread.stop()该方法已经不推荐使用,它不能保证安全的退出线程,这里不讨论。interrupt()方式我...
2018-07-12 17:56:40 1424
原创 onCreate()中getHeight()获取不到高度的原因(源码分析)
问题在Activity的周期方法onCreate()调用getHeight()为什么返回值为0?那在onResume()方法中可以获取到吗?那调用getMeasureHeight()可以获取到值吗?我们从源码分析一下。Activity启动简述其实,这里就涉及到Activity启动流程的问题,要点就是Activity.onCreate()/onStart()/onResume()等生命周期方法和vi...
2018-07-01 18:11:47 963
原创 Android GreenDao数据库升级数据迁移
概述之前数据库升级,做法是删除旧表新建新表,这样所有的数据均被删除,那么一些私有数据,例如用户登录信息也被删除。这样的用户体验很不好,用户更新APP后,需要重新登录。为改进用户体验,我们将用户私有数据做迁移。这样用户不需要重新登录。设计方案总体设计方案如下:1、创建临时表存储旧表数据2、删除旧表3、创建新表4、将旧表数据迁移至新表在迁移时需要考虑一个问题:若新表的表结构有变化如何处理?在代码中我们...
2018-06-28 21:06:02 1316
原创 TCP与UDP协议的区别与应用
概述TCP与UDP协议均是网络框架中运输层的协议,TCP是有连接的,在正式进行数据传输之前,客户端会与服务端通过三次握手进行连接。并且TCP提供更可靠的数据传输服务。所谓可靠,是因为TCP协议实现了一些例如重连、确认、窗口、重传、拥塞控制等机制保证数据传输的可靠性,不会出现丢包现象。UDP是无连接的,没有像TCP一样的确保数据传输成功的机制UDP(User Datagram Protocol) U...
2018-06-28 17:48:19 1055
转载 Java不可重入锁和可重入锁理解
最近正在阅读Java ReentrantLock源码,始终对可重入和不可重入概念理解不透彻,进行学习后记录在这里。基础知识Java多线程的wait()方法和notify()方法这两个方法是成对出现和使用的,要执行这两个方法,有一个前提就是,当前线程必须获其对象的monitor(俗称“锁”),否则会抛出IllegalMonitorStateException异常,所以这两个方法必须在同步...
2018-06-28 15:30:35 65993 23
原创 Android异步加载方案
Android的Lazy Load主要体现在网络数据(图片)异步加载、数据库查询、复杂业务逻辑处理以及费时任务操作导致的异步处理等方面。在介绍Android开发过程中,异步处理这个常见的技术问题之前,我们简单回顾下Android开发过程中需要注意的几个地方。Android应用开发过程中必须遵循单线程模型(Single Thread Model)的原则。因为Android的UI操作并不是线程安全的,...
2018-06-27 15:59:31 595
原创 Java单链表:输入两个有序链表合成为一个有序链表(最笨的办法)
一个比较常见的算法题:合并两个已知排序的单链表,合并后保持有序。网上有很多解法,都是什么所谓的并轨排序,将一个链表合并插入到另一个链表中。自己想出个最笨的方法,维护第三个resultSingleLink。从两个输入的链表中取值比较并插入到resultSingleLink中。先看下我定义的SingleLink,其中提供了很多API方便调用,顺便可以复习一下单链表写法。如下:/** * Create...
2018-06-23 16:23:08 1121
原创 Java线程池原理分析
Java虚拟机启动一个新线程的成本比较高,当程序中需要启动大量且生存期很短暂的线程时,可以考虑使用线程池。Java为我们提供了四种线程池使用。1)创建单个线程的线程池ExecutorService threadPool = Executors.newSingleThreadExecutor()2)创建多个线程的线程池ExecutorService threadPool = Executors.ne...
2018-06-22 10:59:13 255
原创 Java虚拟机类加载机制
本篇文章为阅读《深入理解java虚拟机》第二步笔记类加载阶段 类从被加载到虚拟机内存中开始,到卸载出内存为止,整个生命周期包括加载(Loading)、验证(Verification)、准备(Preparation)、解析(Resolution)、初始化(Initalization)、使用(Using)、卸载(Unloading)7个阶段,其中验证、准备、解析3个部分统称为链接(Linking...
2018-06-20 14:05:52 192
原创 Android应用功能开发之计时锁屏
需求描述 在开发金融类APP时,经常会有这样一种需求,超过时间限制未操作页面,需要页面回到密码登录页,一般是回到手密页,那我们如何实现这样一种需求呢?方案设计 APP跑起来之后,我们一定会有一种类似Manager的角色,它是单例的且与APP生命周期相同的一直跑在内存中。它的作用是管理业务,串联业务流程,启动页面等。我们可以单独做一个TouchTimeoutManager作为计时器,每隔...
2018-06-15 15:24:03 2476
原创 Android开发抽象状态机
前言 在Android APP开发过程中,有时可以采用状态机来解决某些复杂业务,例如下拉刷新功能,我们可以更加行为将其划分为Normal状态、Pull状态、Loading状态,根据不同的状态我们实现该状态下行为。例如Loading状态下我们需要显示loading图标。Pull(下拉)状态下我们要计算下拉距离等等。这篇文章我们一起探讨编写一个抽象状态机,在业务模块可以继承抽象状...
2018-06-13 13:42:32 285
原创 状态模式及java实现
定义 定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它的类。应用场景 1.一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为。 2.一个操作中含有庞大的多分支的条件语句,且这些分支依赖于该对象的状态。这个状态通常用一个或多个枚举常量表示。 通常,有...
2018-06-13 10:17:35 1255
原创 浅谈Android java层ServiceManager
概述ServiceManager作为Android进程间通信binder机制中的重要角色,运行在native层,由c++语言实现,任何Service被使用之前,例如播放音乐的MediaService,例如管理activity的ActivityManagerService,均要向SM注册,同时客户端使用某个service时,也需要向ServiceManager查询该Service是否注册过了。Ser...
2018-06-08 15:08:40 6488
原创 Android Service使用方法回顾
Service作为Android四大组件之一,承载着重要的作用,同时,熟悉Service也会为理解Binder打下重要的基础,这里是我初学Android时做的关于Service的笔记,现在总结到这篇文章中。概述android中的service与Windows中的服务类似,一般没有用户界面,运行在后台,可以执行耗时的操作,是安卓四大组件之一。其他组件可以启动service,并且当用户切换另外...
2018-06-07 21:09:18 333
原创 Android SystemServer解析
概述 理解该文章,需要阅读者对Android进程间通信方式Binder有一定了解,理解Binder的方式之一便是找到一个系统中binder通信的例子,例如activity启动过程,该过程描述了应用进程的activity和系统进程,准确的说是SystemServer进程中的ActivityManagerService通信。其实,SystemServer进程中不仅仅运行着AMS,还运行着其他各种...
2018-06-07 16:38:14 5499
TA创建的收藏夹 TA关注的收藏夹
TA关注的人