自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(111)
  • 收藏
  • 关注

原创 LeetCode分类整理及解题记录

Github项目地址:https://github.com/zhangtiansimple/Leetcode如果有那么一点点帮助到了小伙伴,还请给予个小小的star鼓励~

2019-10-24 22:40:08 942

原创 leetcode 417. 太平洋大西洋水流问题

https://leetcode-cn.com/problems/pacific-atlantic-water-flow/思路是从海洋开始逆流 如果可以逆流到 就标记为1 然后检查两个海洋都可以逆流到的区域DFSpublic List<List<Integer>> pacificAtlantic(int[][] matrix) { if (matrix.length == 0 || matrix[0].length == 0) {

2020-07-31 09:45:05 320

原创 Android基础 -- 子线程可以修改UI吗?

子线程可以修改UI吗?为什么会产生这样的问题,可能是因为在开发过程中遇到了"Only the original thread that created a view hierarchy can touch its views."这个异常信息,又或者是常用Handler将子线程中的数据更新到UI上,又或者是其他的一些原因,如果你思考到了为什么要在主线程中更新UI或者子线程中可以更新UI吗这...

2020-05-07 11:14:12 625

原创 Android Fragment退出 返回上一个Fragment与直接退出

例如应用底部有两个导航按钮A与B,刚进入的时候显示为第一个AFragment,点击B切换到BFragment。如果需求是在BFragment点击返回键回到AFragment,需要配置app:defaultNavHost="true"如果需求是在BFragment点击返回键直接退出,则配置为falseapp:defaultNavHost="false"...

2020-04-20 11:40:31 4559

原创 Android基础 -- Jetpack组件的使用

关于ViewModel、LiveData、DataBinding、LifeCycle、Paging和Room的使用,做了一期一个多小时的视频,不相关的基础代码都是在视频外写好,视频时间里会让小伙伴们以最快的速度了解Jetpack相关组件的使用,欢迎小伙伴们观看~视频地址:https://www.bilibili.com/video/BV147411w7CJ/源码地址:https://git...

2020-03-24 21:06:58 256

原创 ViewModelProviders is deprecated

原有的创建ViewModel的方法:viewModel = ViewModelProviders.of(this).get(ViewModel.class);提示ViewModelProviders过时改为:viewModel = new ViewModelProvider(this).get(ViewModel.class);...

2020-02-15 10:18:22 4241 2

原创 Android基础 -- 自定义View中构造代码块的使用

自定义View想必大家都不陌生,会想自定义View的第一步,就是给它添加不同的构造方法,然后这里可能会有不同的写法,下面是两种常见的写法。第一种是在每个构造方法里都加上初始化方法public CustomView(Context context) { super(context); init(); } public CustomView(...

2019-12-05 00:47:10 213

原创 Android进阶 -- Retrofit源码结构

Retrofit的源码结构是很简单的,注意这里说的是源码结构,不是源码细节,源码细节十分复杂,本篇文章在于理清Retrofit的源码结构及分享一种看源码的方法。一、Retrofit的使用使用这里使用官方文档的例子1.新建一个存放请求方法的接口public interface GitHubService { @GET("users/{user}/repos") ...

2019-11-29 18:49:17 679

原创 Android基础 -- 贝塞尔曲线

一、简介关于贝塞尔曲线(百度百科)的定义,很多博客都有着详细的介绍,本篇博客来关注具体的实现过程。首先来看2阶、3阶贝塞尔曲线的效果图接下来,看具体的实现过程。项目地址:https://github.com/zhangtiansimple/AndroidBasis二、二阶贝塞尔曲线要想画出二阶贝塞尔曲线,首先需要定义两个坐标点和一个控制点,然后是画笔路径等。...

2019-11-08 22:30:34 285

原创 Android开源项目 -- 展开收起TextView

一、项目简介项目地址:https://github.com/zhangtiansimple/FoldTextView效果图: 二、技术选型本项目采用LinearLayout与TextView实现,根据开发者设置的最大行数,计算高度然后设置给LinearLayout,从而实现文本折叠的功能。三、具体实现1.定义子View的布局即文字的展示TextView与下...

2019-11-03 22:04:19 336

原创 Android开源项目 -- 轮播Banner

一、项目简介项目地址:https://github.com/zhangtiansimple/CarouselBanner效果图:二、技术选型本开源项目采用RecycleView实现,由于一直轮播的关系,需要不断的加载下一页,借用RecyclerView的缓存机制,可以很好的实现内存的管理。三、具体实现1.基本布局最外层采用FrameLayout作为根布局,然...

2019-11-01 22:37:14 340

原创 Android进阶 -- 知乎Matisse源码解析(四)

本篇博客一起来看Matisse的数据加载机制。一、AlbumLoaderMatisse采用Loader机制进行加载,先来看AlbumLoader。AlbumLoader集成自CursorLoader,作为资源加载器,加载好资源之后,通过AlbumCollection实现的LoaderManager.LoaderCallbacks接口,将包含数据的Cursor回调给外部调用的MatissAc...

2019-10-30 22:32:24 404

原创 Android进阶 -- 知乎Matisse源码解析(三)

这篇博客来重点关注Matisse里的自定义View,在MatisseActivity里,看到的逻辑十分流畅,是因为将细节部分都已经封装到了这些不同的组件中了,接下来一起看看这些组件的具体实现。一、AlbumSpinnerAlbumSpinner用来在MatisseActivity里实现不同媒体文件夹的选取,使用ListPopupWindow作为UI显示,使用AlbumsAdapter返回的...

2019-10-24 22:18:46 552

原创 Android进阶 -- 知乎Matisse源码解析(二)

上一篇分析了启动MatissActivity之前的逻辑,接下来看MatissActivity。一、实现接口public class MatisseActivity extends AppCompatActivity implements AlbumCollection.AlbumCallbacks, AdapterView.OnItemSelectedListene...

2019-10-23 23:17:28 570

原创 Android进阶 -- 知乎Matisse源码解析(一)

Matisse做了这样一件事情,在需要选择图片视频的时候,调用Matisse.from(MainActivity.this) .choose(MimeType.allOf()) .countable(true) .maxSelectable(9) .addFilter(new GifSizeFilter(320, 320, 5 ...

2019-10-21 22:53:18 612

原创 Android进阶 -- 屏幕刷新机制

关于屏幕卡顿,从表象来讲,是因为主线程有耗时操作,导致屏幕绘制掉帧,屏幕每16毫秒会刷新一次,也就是每秒刷新60次,人眼能感觉到的卡顿的帧率是每秒24帧。所以解决卡顿的一般处理方法就是将耗时操作放在子线程、减少View层级、多使用include merge viewstub标签等,来保障屏幕绘制的流畅。不过再往深里看,会有这样一些问题:卡顿的底层原因是什么?如何理解16毫米刷新一次?假如界面没...

2019-10-16 22:04:51 1871

原创 Android基础 -- SurfaceView

一、什么是SurfaceView普通的View是通过Android系统发出的VSYNC信息来进行屏幕的绘制,但是在一些需要频繁刷新的场景,如直播、游戏等,如果执行了很多操作,就会导致绘制间隔超时,也就是用户感知的卡顿,SurfaceView就是为了应对这样的场景而诞生的。SurfaceView继承自View,拥有独立的绘制表面,即它不与其父View共享同一个绘制表面,可以单独在一个线程进行绘制,...

2019-10-12 23:14:22 441

原创 Android进阶 -- 避免创建不必要的对象

在内存调优的过程中,如何避免创建不必要的对象,一直是很重要的一个方面,下面来一起看看常用的避免创建对象的方法。1.字符串的拼接public static String buildString(String[] values) { String res = “”; for (String value : values) { res += values; } return res...

2019-10-11 22:32:21 201

原创 Android常用工具 -- 颜色透明度

在开发中常常会遇到这种情况,设计师给出的色值有一个透明度,这个时候就需要我们自己添加在色值的前两位,下面是常用透明度对照表<!--透明度百分比 : 8位颜色值前两位--> <!--100% : FF--> <!--95% : F2--> <!--90% : E6--> <!--85% : D9-->...

2019-09-28 22:58:58 194

原创 Android进阶 -- postDelay原理解析

在日常开发中,需要延时任务的时候,往往会用到handler.postDelay()的方法,那么一起来看看它的内部实现原理吧。//Handler.javapublic final boolean postDelayed(Runnable r, long delayMillis) { return sendMessageDelayed(getPostMessage(r)...

2019-09-28 00:23:22 3624

原创 Android TabLayout -- 反射修改TabLayout下划线(Indicator)宽度失效的问题

在使用TabLayout的时,常常会遇到修改下划线(indicator)的需求,但是源码并没有提供修改宽度的api,而是始终和最长的下划线宽度保持一致,这点可以在源码里得出结论,源码如下(api26后源码有修改,这也就是为什么网上很多修改宽度方法失效的原因,不过思路都是一样的,本篇博客基于api28)下划线主要由这个类SlidingTabIndicator实现,它是TabLayout的一个内部...

2019-09-22 21:08:50 938

原创 Android布局 -- Navigation实现底部导航栏

底部导航栏加页卡的切换,很多App采用这种布局设计,在以前的开发中,需要自定义底部导航栏以及使用FragmentTransaction来管理Fragment的切换,代码量较大,而使用Navigation后,系统框架为我们做了任务管理,大大简化了代码。项目地址:https://github.com/zhangtiansimple/navigationBottomBar1.导入相关...

2019-09-17 21:46:24 2471 1

原创 Android基础 -- View的滑动

滑动在日常开发中的出现频率可以说是非常的高,几乎大多数应用都离不开滑动这个功能。Android的滑动主要实现方法有三种通过View本身提供的scrollTo/scrollBy方法 通过动画 通过改变View的LayoutParams使得View重新布局一、使用scrollTo/scrollBy先来看scrollTo/scrollBy的具体实现/** * Move ...

2019-09-17 20:18:59 161

原创 Android动画基础 -- 属性动画

Android动画主要分为三类,帧动画、补间动画和属性动画本篇博客一起来看属性动画一、什么是属性动画属性动画(Property Animation)是在Android3.0才推出的,并不像帧动画与补间动画一样很早就进入了江湖。那么后推出肯定是为了解决之前存在的某些问题,那么帧动画和补间动画存在什么问题呢?帧动画和补间动画的局限性:1)动画效果单一,可拓展性差补间动画只...

2019-08-15 22:01:42 234

原创 Android动画基础 -- 补间动画

Android动画主要分为三类,帧动画、补间动画和属性动画本篇博客一起来看补间动画一、什么是补间动画补间动画通过确定开始的视图样式和结束的视图样式,在状态转移的过程中,系统做了一个补全的动画。二、补间动画的特点补间动画只能作用于视图控件view,如我们常使用的TextView、ImageView、Button等,不可作用于View组件的属性,如背景、颜色等需要注...

2019-08-14 21:58:35 273

原创 Android动画基础 -- 帧动画

Android的动画主要分为三类,分别是帧动画、补间动画和属性动画。本篇博客来看帧动画的实现。一、什么是帧动画帧动画一般用来实现较为复杂的个性化动画,通过一系列的图片循环播放,形成视觉上的动画效果。二、帧动画的特点在使用帧动画的时候,一定要避免使用过大的图片,以免引起OOM。帧动画的优点在于使用简单、方便。三、如何使用首先将动画资源,即每张图片资源...

2019-08-14 20:16:24 242

原创 Android进阶 -- EventBus源码解析(三)

这篇文章来看EventBus的解注册过程public synchronized void unregister(Object subscriber) { List<Class<?>> subscribedTypes = typesBySubscriber.get(subscriber); if (subscribedTypes != n...

2019-08-09 21:18:31 266

原创 Android进阶 -- EventBus源码解析(二)

上一篇博客看了register的过程,这篇博客来看post的过程public void post(Object event) { PostingThreadState postingState = currentPostingThreadState.get(); List<Object> eventQueue = postingState.even...

2019-08-07 22:09:13 149

原创 Android进阶 -- EventBus源码解析(一)

在发送的消息的时候,会通过EventBus.getDefault().register()进行调用,先来看下EventBus.getDefault()方法public static EventBus getDefault() { if (defaultInstance == null) { synchronized (EventBus.class) {...

2019-08-07 21:33:32 239

原创 Android进阶 -- Binder

一、什么是BinderBinder在Android中的应用场景非常的多,以至于应用不同的应用场景来解释Binder,会更加通俗易懂。1)从应用机制来讲,Binder是Android一种实现跨进程通信(IPC)的方式。2)从模型结构来讲,Binder是一种虚拟的物理设备驱动,连接server进程、client进程和ServiceManager进程3)从实现来讲,Binder是一个类,...

2019-08-07 20:08:22 168

原创 Android性能优化 -- 内存优化

1.Android的内存管理Android的内存管理 = 内存分配 + 内存回收(释放)1)内存分配对象/变量的内存分配由程序自动负责,共有三种静态分配:存在于方法区,线程共享,存储已被虚拟机加载的类信息、常量、静态变量,在编译时就已经分配好并且存在于程序整个运行期间。 栈式分配:存在于栈区,线程独享,存储方法执行时的局部变量(含数据类型以及对象的引用),方法执行时,定义的局部变...

2019-08-06 21:58:54 397

原创 Android性能优化 -- 内存泄漏

1.什么是内存泄漏内存泄漏(Memory Leak):程序在申请内存后,当该内存不需要再使用,但却无法被释放并且归还给系统的现象。内存泄漏会使得应用程序更有可能发生内存溢出(OOM)根本原因为:本该被回收的对象,因为某些原因而不能被回收,从而继续停留再堆内存中本该被回收的对象是已经不需要再被使用的对象,因为某些原因而不能被回收指的是有另外一个正在使用的对象持有它的引用,也就是说,持...

2019-08-06 20:17:13 177

原创 Android网络基础 -- TCP、UDP

1.什么是TCPTCP(Transmission Control Protocol):传输控制协议,属于传输层,基于TCP协议的应用层协议有HTTP、STMP、FTP、Telnet、POP32.特点面向连接:使用TCP传输数据前,必须先建立TCP连接;传输完成后在释放连接 全双工通信:建立TCP后,通信双方都能发送数据 可靠:通过TCP连接发送的数据:不丢失、无差错、不重复并...

2019-08-05 21:56:58 184

原创 Android网络基础 -- Http

1.定义Http(HyperText Transfer Protocol)是一个应用层协议,定义了应用间进程通信的的准则。2.特点1)传输效率高:Http是无状态的,即在数据传输的过程中,不保存任何历史和状态信息 http协议是无连接的,所以在交换Http报文前,不需要建立Http连接(简化了服务器的设计,使服务器更容易的支持大量的并发请求) 传输格式简单,即在请求时,只...

2019-08-05 20:07:49 168

原创 Android网络基础 -- Socket

1.什么是SocketSocket即套接字,是应用层 与TCP/IP协议族通信的中间软件抽象层,表现为一个封装了TCP/IP协议族的编程接口。Socket不是一种协议,而是一个编程调用的接口,属于传输层接口,主要用来解决数据在网络种传输的问题。通俗的理解,就是应用层无需关注这些协议的细节,只要按照Socket的接口进行编程,就可以直接使用TCP/IP协议族进行通信,主要有的协议有运输层的T...

2019-08-05 00:29:22 164

原创 Android基础 -- Android多线程

多线程在Android开发过程中非常常见,同时又知识点繁多,Thread、Runnable、Handler、AsyncTask、HandlerThread、IntentService、线程池这些相信小伙伴们都耳熟能详,这边文章将和小伙伴们一起来在看看多线程。一、基础概念首先我们来在回顾一下线程、进程的相关概念1.线程1)概念线程是一个基本的CPU执行单元,程序执行流的最小...

2019-08-04 00:43:32 251

原创 Android基础 -- Android HandlerThread

1.简介AndroidThread是一个Android已经封装好的轻量级异步类,用来方便开发者更快的实现多线程、异步通信、消息传递等。2.使用步骤// 步骤1:创建HandlerThread实例对象// 传入参数 = 线程名字,作用 = 标记该线程 HandlerThread mHandlerThread = new HandlerThread("handlerThre...

2019-08-02 22:01:09 281

原创 Android基础 -- Android线程池的使用

小伙伴们对于Thread、Runnable、Handler、AyscTask应该十分熟悉,并且借助它们完成了一个个炫酷的功能,那么关于线程池的了解呢?这边文章就和小伙伴一起来看看关于线程池的这些事1.什么是线程池线程池是1块缓存了一定线程数量的区域,用来复用线程和管理线程,如统一分配、调优、监控和控制最大并发数等优点:降低因线程创建销毁所带来的性能开销 重用缓存线程池的线程 提高...

2019-08-02 21:06:37 263

原创 Android基础 -- Android IntentService

一、什么是IntentService?有什么作用?IntentService是Android里的一个封装类,继承了四大组件之一的Service,一般用来处理异步请求或者实现多线程二、使用场景IntentService用来执行线程任务,需按顺序在后台执行,例如离线下载等三、使用步骤-->定义IntentService的子类,需重写onHandleIntent()...

2019-08-02 20:20:15 167

原创 Android基础 -- Android Service

Service在Android开发的过程中,相信小伙伴们都没有少与它互动,如此重要的组件,现在来一起在看看它吧一、什么是Service?Service是Android的四大组件之一,属于计算型的组件,它提供在后台需要上时间运行的服务,例如音乐播放、文件下载等,有着无用户界面、后台运行、生命周期长等特点。二、Service的生命周期是什么样子的?Service的生命周期与...

2019-08-01 22:03:48 144

空空如也

空空如也

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

TA关注的人

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