自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 独立开发了一款Material3风格的RSS阅读器 - Agr Reader

个人独立开发的RSS阅读器Agr Reader开放下载!远离推荐算法构建的信息茧房,高效获取信息。

2023-09-16 18:10:16 849

原创 论如何在Android中还原设计稿中的阴影

每当设计稿上注明需要添加阴影时,Android上总是显得比较棘手,因为Android的阴影实现方式与Web和iOS有所区别。

2023-09-16 11:15:23 548

原创 Design WanAndroid(WanAndroid的最佳可使用的Android客户端)

WanAndroid的最佳Material Design实践,严格遵循Material3设计,MVVM架构,保证UI风格、逻辑设计的一致性,确保日常使用体验舒畅,达到可日用性。

2022-07-08 11:12:01 945 1

原创 Android Jetpack -- Room篇

Room 在 SQLite 上提供了一个抽象层,以便在充分利用 SQLite 的强大功能的同时,能够流畅地访问数据库。处理大量结构化数据的应用可极大地受益于在本地保留这些数据。最常见的用例是缓存相关数据。这样,当设备无法访问网络时,用户仍可在离线状态下浏览相应内容。设备重新连接到网络后,用户发起的所有内容更改都会同步到服务器。由于 Room 负责为您处理这些问题,因此我们强烈建议您使用 Room(而不是 SQLite)Room添加依赖如下: implementation "androidx.ro

2020-08-21 17:14:30 420

原创 数独游戏的解法到App的实现

在LeetCode上偶然刷到一个解数独的题目:编写一个程序,通过已填充的空格来解决数独问题。一个数独的解法需遵循如下规则:数字 1-9 在每一行只能出现一次。数字 1-9 在每一列只能出现一次。数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。空白格用 ‘.’ 表示。一个数独。答案被标成红色。Note:给定的数独序列只包含数字 1-9 和字符 ‘.’ 。...

2019-09-21 14:33:37 622

原创 Android 自定义View(画线循迹,雷达图+动画实现)

自定义首先接触到的时候觉得很有兴趣,便学习了一下HenCode自定义View教程,每个章节部分还会有配套的联系项目,难以理解的地方还有视频介绍,很用心的教程了HenCoder Android 开发进阶: 自定义 View 1-1 绘制基础HenCoder Android 开发进阶: 自定义 View 1-2 Paint 详解HenCoder Android 开发进阶:自定义 View...

2019-09-19 14:52:42 747

原创 在LeetCode第一次写出400+ms时间 360+MB内存的代码。。。。。

第一次写出这么慢的代码,看到这个速度和内存消耗,不禁陷入了沉思。。。。。。果然不能滥用java的集合类

2019-09-15 12:24:53 274

原创 Android Jetpack -- Lifecycles篇

基本概念Lifecycles其实从名字看肯定是与生命周期相关,那它与生命周期又有什么联系?先参考一下官方文档:Lifecycles是一个生命周期感知组件,当Activity或者Fragment的生命周期发生改变的时会,Lifecycles也会做出相应的生命周期状态的改变,它保存关于组件生命周期状态的信息(比如活动或片段),并允许其他对象观察这种状态。可以看出Lifecycles是一个组件,...

2019-09-14 21:31:01 607

原创 Android Jetpack -- Navigation篇

Navigation是指允许用户在应用程序中浏览、进入和退出不同内容的Fragment。Navigation能够实现从简单的按钮单击到更复杂的模式,如应用程序栏和导航抽屉。导航组件还通过遵循一套既定的原则来确保一致和可预测的用户体验。来看下Navigation的原则吧:固定的起始位置:也就是说除去登陆等一次性界面,用户在启动App最先看到的界面需要为一个固定的起始界面。Navigation...

2019-09-14 20:23:04 917

原创 Android Framework学习(三)Activity相关

Activity如何启动Activity的跨应用的启动其本质还是启动另一个进程,所以和启动进程的流程一样的,都是涉及到与AMS,Zygote间的IPC来完成。下面简单概述一下,当当前Activity调用startActivity()时,会调用AMS提供给每个Activitiy的Binder来进行远程调用到AMS的startActivity()方法。这里就略过进程启动的部分细节,先提供示意图来...

2019-09-14 15:20:39 220

原创 Android Jetpack架构组件

Jetpack时Google新推出的一种架构模式

2019-09-07 12:05:09 5863 4

原创 Android Jetpack -- DataBinding篇

DataBinding的存在是为了脱离Controller与View之间的引用联系。如下图所示这样,Controller只处理与业务逻辑相关的操作。我感觉DataBinding和Butterknife的思想很类似,估计Google参考了各种优秀的框架任何自己统一推出了集各家精华的架构方案。DataBinding使用首先再build.gradle中开启dadabindingdataBin...

2019-09-06 14:21:47 964

原创 Android Jetpack -- LiveDate篇

LiveData是一个可观察的数据持有者类,不过它和其他的可观察对象不同,它会与生命周期相关联,比如Activity的生命周期,LiveData能确保仅在Activity处于活动状态下才会更新。也就是说当观察者处于活动状态,才会去通知数据更新。个人觉得这是为了避免内存泄漏,可以说是很实用了,因为要想避免内存泄漏,必须要感知到生命周期,而原本并没有提供额外的方法,像Glide采用了一个透明的Fra...

2019-09-06 13:28:58 854

原创 Android Jetpack -- ViewModel篇

ViewModel的出现主要为了解决两个问题:1.当Actvitiy销毁重建过程中的数据恢复问题,虽然原来可以使用onSaveInstanceState()来完成,但是只支持能被序列化的数据而且是小量数据,对于大量数据则显得有点无力。2.UI控制器的工作繁忙,UI控制器主要用于处理显示,交互,其他的额外操作可以委托给其他类完成,将不应该分配给UI的任务分离出来是必要的,这也就是上面所说的分离关...

2019-09-06 00:06:13 2002

原创 Android Framework学习(二)应用进程启动相关

Linux系统中进程的启动的创建分为创建和执行两个步骤,具体由fork()和exec()函数实现,首先fork()通过拷贝当前进程来创建一个子进程。然后exec()(该名字泛指系统调用,具体由execl,execv,execle和execve)函数负责读取可执行文件并将其载入进程的地址空间开始运行。不带exec只是单纯的执行fork(),子进程会直接共享父进程的资源。具体可参考Linux操作系统...

2019-09-05 17:23:07 229 1

原创 汇总篇

java相关:基础Java8新特性String类详解及引伸来的equals,==,hashcode区别和StringBuilder和StringBuffer比较java多线程Java Object类Clone()方法java注解相关介绍与实例源码Collection.sort(TimSort)源码学习java hashMap源码学习ConcurrentHashMap分...

2019-09-05 12:36:54 138

原创 约瑟夫环问题

偶然看到一个题目:N个人围成一圈(0~n-1),从第一个人开始报数,报到m(m-1)的人出圈,剩下的人继续从出圈的下一个人开始报数,报到m(m-1)的人出圈;如此往复,直到所有人出圈。(模拟此过程,输出出圈的人的序号)第一眼看过去,大概感觉会是找规律的题目,直观方法首先想到的是,每次在出圈的人后面到末尾补上前面的人,比如N = 5, m = 31,2,3,4,5第一次3出圈,然后在5后...

2019-09-05 12:07:04 172

原创 java注解相关介绍与实例

注解:Java 注解用于为 Java 代码提供元数据。作为元数据,注解不直接影响你的代码执行,但也有一些类型的注解实际上可以用于这一目的。Java 注解是从 Java5 开始添加到 Java 的。提供了一种原程序中的元素关联任何信息和任何数据的途径和方法注解介绍注解如同一种标签,表明对被注解的事物行为的某些角度的评价与解释。首先来了解一下Java自带的部分常用注解:@Overr...

2019-09-04 17:07:38 144

原创 Android Framework学习(一)系统服务相关

Zygote启动我们知道Android的所有进程都是通过Zygote进程孵化而来的,那就有个疑问Zygote又是哪来的?所有,我们首先来了解一下Zygote进程是怎么启动的。首先Linux系统启动后会在用户空间创建第一个进程init进程,进程号固定为1。然后调用init中的main()方法执行init进程的职责。对于init进程的功能分为4部分:解析并运行所有的init.rc相关文件根...

2019-09-03 22:56:39 288

原创 动态规划

最优收入问题public static void main(String[] args) { int[][] nums = {{0, 0}, {1, 4}, {3, 5}, {0, 6}, {4, 7}, {3, 8}, {5, 9}, {6, 10}, {8, 11}};//表示时间段 int[] money = {0, 5, 1, 8, 4, 6, 3, 2,...

2019-09-03 14:01:34 427 2

原创 Retrofit原理(五):设计模式和总结

Retrofit里面还充斥着大量的设计模式建造者模式首先肯定是建造者模式,这个太普遍了,几乎哪里都使用到了,就不做过多的说明工厂模式然后是工厂模式,采用的是抽象工厂模式,在它额Converter抽象类中可以很明显的看到public interface Converter<F, T> { @Nullable T convert(F value) throws IOExcep...

2019-08-24 15:45:13 246

原创 Retrofit原理(四):返回值的参数是怎么获取到的?

T

2019-08-24 13:49:47 638

原创 Retrofit原理(三):Response响应处理

继续回到我们的create()方法public <T> T create(final Class<T> service) { Utils.validateServiceInterface(service); if (validateEagerly) { eagerlyValidateMethods(service); } ret...

2019-08-23 23:44:07 1835

原创 Retrofit原理(二):Request请求处理

还是回到上文的create方法处IRetrofitTest iRetrofitTest = retrofit.create(IRetrofitTest.class);再进入create方法到return loadServiceMethod(method).invoke(args != null ? args : emptyArgs);ServiceMethod<?> loa...

2019-08-23 16:39:23 269

原创 Retrofit原理(一):动态代理介绍

最近用到Retrofit,发现只需要定义一个接口就能完成相应功能,这是怎么做到的?这是用到了java的动态代理机制,Proxy类还是先来看下使用的流程吧,和okhttp一样分为异步和同步,其实Retrofit是对网络请求接口的封装,具体的网络请求是通过底层的Okhttp来实现的,所以后面的流程是一样的先定义一个接口public interface IRetrofitTest { ...

2019-08-23 12:56:52 594

原创 ConcurrentHashMap分析

很多次听到ConcurrentHashMap的一大堆优点,但是每次听到都是云里雾里,并不了解这些优点的本质,所以,要破解这些疑问还得要从实际入手,去观摩源码。以上是Map集合的各类比较,注意ConcurrentHashMap的key和Value都不能为null首先要知道ConcurrentHashMap是JDK5引入的线程安全的HashMap,但是再JDK7之前一直采用的是Segment分段...

2019-08-21 00:43:34 123

原创 Okhttp3 源码流程梳理

首先OkHttp的应该都知道以下为异步请求OkHttpClient client = new OkHttpClient(); Request request = new Request.Builder() .url("") .build(); Call call = client.newCall(...

2019-08-18 20:53:58 193

原创 AsyncTask 串行SERIAL_EXECUTOR,并行THREAD_POOL_EXECUTOR分析

AsyncTaks的内部实现机制相信已经很多人了解过了,但是多次调用excute()后,它是怎么执行的?带着这个疑问,来实践下看看public class TestActivity extends AppCompatActivity { private static int ID = 0; private static final int TASK_COUNT = 20; ...

2019-08-05 22:20:00 774

原创 AbsListView源码RecyclerBin解析

都知道ListView有复用View的机制,但是具体是怎么复用的却不怎么明白,里面的机制一概不知,百度了下也是云里雾里,果然纸上得来终觉浅,绝知此事要躬行,还是要自己深入源码去学习RecycleBin的重要成员变量 private RecyclerListener mRecyclerListener; //存储在mActiveViews中的第一个视图的位置。 private...

2019-08-01 19:51:27 319

原创 Java Object类Clone()方法

偶然看到clone()方法,发现我对这个方法如此陌生,还是Object里的方法,不去了解怎么行了解的最好办法就是直接去看源码了,发现是个native方法,去看注释/** * Creates and returns a copy of this object. The precise meaning * of "copy" may depend on the class o...

2019-07-24 23:06:05 195

原创 java hashMap源码学习

首先来简单了解下HashMap,众所周知其是个散列表,存储<key, value>结构extends AbstractMap<K,V> implements Map<K,V>, Cloneable, Serializable,而且它不是线程安全的有关Map的继承关系如下图,借用[3]其静态成员变量 //默认的初始容量16,必须是2的倍数 stat...

2019-06-28 16:23:17 101

原创 Android特有的数据结构SparseArray,ArrayMap

Android特有的数据结构有ArrayMapArraySetSparseArray首先来看SparseArray,该类的官方说明:(自己更改了些)SparseArray是类型的Map,比HashMap<Integers, Object>的内存效率更高,因为避免了对int的封装,并且不依赖于Entry结构。SparseArray比HashMap更省内存,它对数据采取了...

2019-05-06 11:24:49 847 2

原创 Collection.sort(TimSort)源码学习

Collections 工具类Collections 工具类中有自带的sort()排序方法,比较好奇是怎么实现的,然后查看源码,是用到了Array类中的sort方法 public static <T> void sort(T[] a, Comparator<? super T> c) { if (c == null) { s...

2019-04-25 15:47:46 607

原创 java多线程

java多线程还是很重要的,进程:一个进程包括由操作系统分配的内存空间,包含一个或多个线程。一个线程不能独立的存在,它必须是进程的一部分。一个进程一直运行,直到所有的非守护线程都结束运行后才能结束。线程:进程中负责程序执行的执行单元,线程本身依靠程序进行运行,是程序中的顺序控制流,只能使用分配给程序的资源和环境线程的生命周期新建状态:使用 new 关键字和 Thread 类或其子类建...

2019-04-19 15:47:54 87

原创 String类详解及引伸来的equals,==,hashcode区别和StringBuilder和StringBuffer比较

1.StringBuilder和StringBuffer比较1.三者在执行速度方面的比较:StringBuilder > StringBuffer > String2.String <(StringBuffer,StringBuilder)的原因String:字符串常量StringBuffer:字符串变量StringBuilder:字符串变量Strin...

2019-04-16 22:42:17 500

原创 Java8新特性

Java8——Lambda表达式语法Lambda表达式的重要特征:变量作用域java8的新特性之一,Lambda 表达式,也可称为闭包。Lambda 允许把函数作为一个方法的参数(函数作为参数传递进方法中)。使用 Lambda 表达式可以使代码变的更加简洁紧凑。但是实质上是类似于“语法糖”,将你包装好的代码有编译器来完成转换,从而使代码更加的简洁,不太推荐经常使用,因为它尽管很简洁,但是难懂,...

2019-04-14 16:35:41 226

原创 Android学习笔记(六)-----Activity与Fragment

 4-1-1 Activity的创建新建类继承Activity或其子类 在AndroidManifest中声明 创建layout并在Activity的onCreate中设置在AndroidManifest.xml里可设置android:theme:设置主题样式android:screenOrientation:用于控制activity启动时方向,一般设置竖屏或横屏显...

2018-12-06 21:29:18 340

原创 Android学习笔记(五)-----Toast,AlartDialog,ProgressBar&ProgressDialog,自定义Dialog,PopMenu

第三节 UI组件之弹出组件3-1 消息提示 1.设置显示的位置代码如下:Toast toastCenter = Toast.makeText(getApplicationContext(),"居中Toast",Toast.LENGTH_SHORT);toastCenter.setGravity(Gravity.CENTER, 0, 0);//后两个参数为x偏移量,y偏移量...

2018-12-01 21:40:28 590

原创 Android学习笔记(四)-----RecyclerView,WebView

(2-11)RecyclerView其官方定义是:A flexible view for providing a limited window into a large data set能够灵活的实现大数据集的展示,视图的复用管理比ListView更好,能够显示列表,网格,瀑布流等形式,且不同的ViewHolder能够实现item多元化的功能1.LinearRecyclerView...

2018-11-28 18:54:51 992

原创 Android学习笔记(三)----ImageView,ListView,GridView,ScrollView & HorizontalScrollView

继续…(二)ImageView1.常用属性 scaleTypefitXY:填满控件,宽高比可能会发生改变fitCenter:保持宽高比缩放,直至能够完全显示centerCrop:保持宽高比缩放,直至能够完全填满控件,会发生裁剪...

2018-11-19 22:03:09 171

空空如也

空空如也

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

TA关注的人

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