自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

MaPengHao的专栏

一只菜鸟的升级之路

  • 博客(86)
  • 问答 (5)
  • 收藏
  • 关注

原创 ARouter源码初探

What is ARouterA framework for assisting in the renovation of Android app componentization官方介绍只有简短的一句话总结,一套协助Android app组件化革新的框架。Why to use it即便是组件化,我们其实也可以用startActivity的方式来进行跳转,那ARouter又有何特殊之处呢?传统的方式,不管是url传参还是bundle传参都较为繁琐,需要把参数先设置到url或者bun..

2021-01-01 08:59:08 373

原创 SharedPreferences的进化版-MMKV

什么是MMKVMMKV的github地址:https://github.com/Tencent/MMKV简介MMKV is an efficient, small, easy-to-use mobile key-value storage framework used in the WeChat application. It’s currently available on Android, iOS/macOS, Win32 and POSIX.官方介绍说MMKV是一套更有效率、更小、..

2020-11-27 19:36:31 359

原创 二进制基础运算整理

原码、反码和补码在正常的运算规则下,我们熟悉的十进制会转化成二进制在计算机中表示,这时的二进制就是原码表示,在计算机中,为了简化运算单元的逻辑处理、降低硬件电路复杂度和成本,只有加法器的硬件电路,计算机的减法是通过数学变换把其转化成加法运算,比如5-2,也就是5+(-2),但是如果用原码形式去运算5+(-2)得到的值却不是我们想要的值,所以经过探索,又出现了反码和补码,至于他们有什么作用,继续往下看。原码原码就是真值的二进制表示,最高位表示符号位,整数的符号位是0,负数的符号位是1。比如..

2020-11-27 19:34:05 510

原创 反射相关API整理

概述很多主流的IOC框架,像移动端的Retrofit、服务端的Spring等的核心思想都是通过反射去实现的,阅读源码的时候有很多反射相关的API调用,而这些东西在平时开发中很少用到,时间久了就会忘记,写下这篇文章来整理复习一下,顺便做个记录。继承关系Class类获取Class对象class对象包含了这了类的fields、methods、constructors。Example:World worldObj,获取它的class对象的方式:Class.forName(World..

2020-11-21 21:09:39 241

原创 print()和println()的区别

简要写demo的时候意外发现print()和printnln()的一些特别的地方,是有关于Java输入输出流的知识,都是些基础知识,但这个偶然的发现加深了一些理解,特别记录一下。fun main(){ GlobalScope.launch { delay(3000L) println("World!") } print("Hello,")// println("Hello,") ..

2020-11-21 08:17:41 3411

原创 RxJava网络异步调用绑定UI生命周期

简述因为Android UI组件通常会频繁性的创建销毁,在搭配异步操作时,子线程持有UI组件引用,而子线程通常用来执行耗时操作,当子线程运行期间UI组件被销毁时,UI组件实例会因为被引用而无法被释放内存占用,所以很容易导致内存泄露。之前分析过RxJava和Retrofit结合使用的源码,其中最后调用了compose(ObservableTransFormer)方法,传入lifecycleProvider.bindToLifecycle()实现和Android UI组件生命周期绑定,以解决UI组件内存..

2020-11-13 21:22:20 280

原创 Retrofit结合RxJava源码分析

为什么要使用RxJava处理Retrofit网络请求Retrofit的调用过程我们前面文章已经整理过了,对于Android来讲呢,绝大部分的网络请求任务都是需要回调操作进行UI修改的,Retrofit网络请求底层是socket通信,因为网络的不确定性所以是阻塞性的,那么网络请求的工作就要放在子线程里去做,比如下面这行代码:List<User> users = service.groupList(1001).execute().body();我们需要把这块代码放进子线程中去调用,然后调..

2020-11-13 21:19:53 308

原创 GsonConverterFactory源码分析

前言前面我们分析了Retrofit的源码,知道了GsonConverterFactory是如何和Retrofit结合起来的。GsonRequestBodyConverter先看请求入参如何转换,即通过handlers[p].apply(requestBuilder, args[p])来解析参数,以ParameterHandler.Body为例:static final class Body<T> extends ParameterHandler<T> { pr..

2020-11-13 21:17:39 704

原创 Retrofit源码分析

本文概述Retrofit作为主流的网络框架,采用注解和接口的方式封装请求,使得调用过程变得优雅又简洁,优雅的背后肯定是卓越的设计,所以从源码角度分析一下Retrofit是如何做到的,整理成文。使用回顾public interface GitHubService { @GET("group/{id}/users?sort=desc") Call<List<User>> groupList(@Path("id") int groupId); /*..

2020-11-08 21:55:17 278

原创 ViewPager和其他View联动动画

实现效果 图中的灰色区域都是可滑动区域,其中我用三种文本颜色表示区域中三个不同的View,黑色部分是TextView,蓝色部分是LinearLayout,红色部分是ViewPager内部的内容。 技术难点 首先要禁用ViewPager的随手指拖动,手指滑动如果抬起时没有一个fling的势头则不会触发动画效果; 其次点击灰色区域的手势监听实现滚动的同时,不能影响ViewPager内容的点击事件,也就是点击红色区域还会触发点击事件; 最后就是这三部分的动画是联动的。 ..

2020-11-07 15:06:55 197

原创 OkHttp源码分析

本文概述结合使用从源码层面分析OkHttp的原理。使用回顾public static String getByOkHttp(String url) throws IOException { OkHttpClient client = new OkHttpClient(); Request request = new Request.Builder() .url(url) .build(); try (Response ...

2020-11-05 21:36:12 204

原创 HttpClient源码分析

本文概述透过源码分析HttpClient的原理。使用回顾public static void sendRequestWithHttpClient() { List<NameValuePair> formparams = new ArrayList<NameValuePair>(); formparams.add(new BasicNameValuePair("account", "")); formparams.add(n..

2020-11-01 18:19:21 1067

原创 HttpURLConnection源码分析

本文概述从源码角度理解HttpURLConnection是怎么一步步封装底层socket调用的。HttpURLConnection使用回顾我们先来回顾一下它的用法:new Thread(() -> { HttpURLConnection connection = null; BufferedReader reader = null; try{ URL url = new URL("https://www.baidu.com");//新建URL ..

2020-11-01 18:17:44 626 1

原创 socket通信总结

本文概述整理了一下socket的基础用法,以及从源码层面理解HttpURLConnection的底层也是使用的socket机制进行的网络通信,socket的网络通信体现在应用层就是read和write操作。Socket是什么所谓套接字(Socket),就是对网络中不同主机上的应用进程之间进行双向通信的端点的抽象。一个套接字就是网络上进程通信的一端,提供了应用层进程利用网络协议交换数据的机制。从所处的地位来讲,套接字上联应用进程,下联网络协议栈,是应用程序通过网络协议进行通信的接口,是应用程序..

2020-11-01 18:16:50 335

原创 Observable.mergeDelayError

作用Combines multiple Observables into one. Any onError notifications passed from any of the source observables will be withheld until all merged Observables complete, and only then will be passed along to the observers.把多个Observable实例组合成一个,任何Observabl..

2020-10-26 21:15:31 542

原创 RxJava原理分析

RxJava用来干什么RxJava is a Java VM implementation of ReactiveX (Reactive Extensions): a library for composing asynchronous and event-based programs by using observable sequences.简单来说,RxJava就是用来处理回调的,使用观察者模式来传递调用回溯,究其根源也就是使用普通的接口回调方式,更奇妙的是,它还使用了装饰模式来封装一层层..

2020-09-21 19:34:31 311

原创 AIDL梳理

何为AIDLAndroid Interface Definition Language即Android接口定义语言我们知道,因为用户需要,Android系统中可以同时运行着多个进程,为了进程间能够正常的运行,进程之间必须保持独立互不干扰,这就是进程隔离。但是很多时候我们又不得不和另一个进程通信,那么这种进程间的通信就叫做IPC(Inter-Process Communication)。实现IPC的方式有很多种,像管道、信号、消息队列、共享内存、Socket等,RPC(Reomote Proc..

2020-07-12 20:22:40 227

原创 Jetpack之安全的FileProvider

首先我们要清楚FileProvider出现的意义是什么,官方的解释是:FileProvider is a special subclass of ContentProvider that facilitates secure sharing of files associated with an app by creating a content:// Uri for a file instead of a file:/// Uri.A content URI allows you to grant r

2020-07-08 19:55:17 953

原创 Jetpack之优雅的Activity回调

在我们的日常开发中,从一个Activity打开另一个Activity并接收其回调结果是一个很普遍的场景,这其中包括打开其他应用的Activity,通常我们的做法都是通过activity.startActivityForResult()方法来实现。这其中除了我们应用内业务相关页面的跳转之外,还有很多像打开相册、调起相机等和系统Activity交互的场景,这些场景每次都要很麻烦的维护很多代码,即使是原生页面跳转也要维护requestCode和bundle数据的key值等常量,代码臃肿难以维护。Jetpack出现

2020-07-03 18:51:06 1596

原创 如何有效提高git的clone速度

git.bach窗口执行git config --global http.postBuffer 524288000命令

2018-05-02 15:25:23 552

原创 关于同一台电脑配置同时运行两个tomcat的问题

1.修改其中一个tomcat中的某些参数,为了避免启动tomcat时出现冲突,编辑bin/startup.bat,在文件第一行添加如下两行SET JAVA_HOME=C:\websoft\jdk1.6.0_33 (JDK所在路径)SET CATALINA_HOME=C:\test\tomcat222222(tomcat解压的路径)2.修改conf/server.xml文件,修改地方有三处 如图注意...

2018-04-13 17:18:08 389

原创 MyBatis和Spring整合后连接sqlserver提示登录Administrator失败问题整理

如上图,spring-mybatis配置文件中的dataSource配置时传入的username属性值现在是jdbc.username,这是已经改好的,原来的是username,jdbc.properties中也是username,不是现在的jdbc.username,问题正是在于,此时${username}的值并不是jdbc.properties文件中的username值,而是JVM系统环境变量...

2018-02-26 16:31:31 620 2

原创 关于IntelliJ IDEA突然debug出现端口已被占用错误

当你debug项目的时候会出现Error running Unnamed: Unable to open debugger port (127.0.0.1:61420): java.net.BindException "Address already in use: JVM_Bind"的错误。网上搜了有好多种方法,有通过netstat -ano查找出占用端口的程序然后资源管理器杀死它,但是根本

2018-01-06 10:02:30 13833 2

原创 android studio安装apk失败

当你调试机已经运行了一个测试程序时,这时你再次run这个程序,就有可能出现一个错误,它会提示你是否删除原有的application,你点击是,很有可能错误就会出现了:event log里显示Failed to finalize session : INSTALL_FAILED_INVALID_APK: /data/app/vmdl1680149043.tmp/3_slice__ signatu

2017-09-29 17:57:08 7635 1

原创 Android Studio修改包名及问题

1.手动修改目录下的包名;2.修改build.gradle里面的applicationId;3.修改manifest里面的package名.如果出现 Error: Some file crunching failed, see logs for details错误,那么请在module下的build.gradle的android标签下加入aaptOptions {     cr

2017-09-28 15:27:11 1214 2

原创 关于极光分享遇到的添加依赖后的编译出错问题

添加上分享依赖后编译出现Error:Execution failed for task ':app:processDebugManifest'. > Manifest merger failed with multiple errors, see logs异常,网上有说修改Manifest里的tools:replace="xxxxx",还有说在build.gradle的根标签下添加useOldMa

2017-09-27 15:37:53 2802 1

原创 FragmentTransaction切换问题

1.如果把GramentTransaction对象定义为全局的,那么如果一次业务中commit大于1次,那么就会报java.lang.IllegalStateException: commit already called异常,所以同一个Transaction对象只能commit一次;2.一次业务中,你定义了两个Transaction对象,那么只会执行第一个Transaction的事务,你会发

2017-09-25 10:00:30 1321

原创 关于ScrollView嵌套滑动控件出现的内容显示不全问题

当你使用ScrollView嵌套ListView、GridView、ViewPager等时,你会发现里面的东西显示不全或者完全不显示(ViewPager),对于这种情况,有两种方式。对于ListView和GridView这种显示不全的情况,你可以重写一个继承自他们的类,重写onMeasure方法:@Override protected void onMeasure(int widt

2017-08-25 18:05:00 3584 1

原创 关于Studio的版本、gradle版本和插件版本的问题

因为公司老总添加了新的jar包,我checkout后发现编译不过,提示有的jar包需要的gradle最小版本是gradle3.3,然后因为老总说他那用的gradle(在线构建管理平台)是4.0,贴上一个可下载各个版本的gradle的网站:点击打开链接下载了4.0版本开始build,结果提示The version of androidstudio is incompitable of cur

2017-08-11 18:22:53 1882

原创 Android实现沉浸式状态栏之再理解

前面学习的解决实现沉浸式状态栏的方法是AndroidManifest中的application的theme属性文件中设置name="android:windowTranslucentStatus">true然后在每一个Activity的根布局中设置fitsSystemWindows属性为true,现在想想挺麻烦,时不时也会忘,今天在简书上看到一边文章点击打开链接了解到沉浸式的意

2017-08-04 18:38:20 241

原创 关于Android中的表情处理

Android中的表情处理在于,发送的表情要转换成Unicode码进行发送,接收的时候再通过Unicode码解析成相应的表情图片,这个Unicode码是通用的,所以不会导致Android和Ios显示混乱,但是他们的表情资源是不一样的,也就是我们通常看见的两个系统的手机表情显示不一样,再加上Android版本的表情看上去不好看,所以我们需要有一套自己的表情资源,映射着统一的Unicode码。Em

2017-08-04 17:38:04 1253

原创 理解补充常见设计模式

1.单例模式:毋庸置疑,一个类只存在一个实例,除了静态方法获取实例之外,最重要的是这个类的构造方法要被显示声明成private类型,防止可以通过构造方法实例化。Android中体现在context.getSystemService()方法,调用的服务都是单例。点击打开链接2.Builder建造者模式:它的构造过程一般很复杂,步骤繁多,但是顺序不固定。像Android的Alert

2017-06-26 21:20:55 277

原创 关于使用spring文件上传遇到的服务器中的图片访问不到报404的问题

这个问题发生的环境是上传文件,我是用的spring文件上传,上传步骤如下:首先,applicationContext.xml中配置好文件上传的bean:之后导入所用到的jar包,一般来说,MyEclipse集成了spring框架之后,项目下就会自动添加了相关jar包,但是当你布置好了一系列文件上传步骤之后,一测试发现会报500错误,提示找不到类,或者报不是Multipart类型的r

2017-06-24 19:14:36 9937

原创 关于SpringMVC实现操作

在classpath下新建一个.properties属性文件,里面写好数据库的相关信息:注意里面的url的“\:”是转义字符,driver是通过解压工具打开驱动jar查看的Driver.class的路径,在这里注意要把驱动jar包添加到tomcat的lin下,只单单是放在项目下会出现找不到的错误,可能你放在WEB-INF下的lib中应该也能行,不妨试试。2.新建JdbcDataSour

2017-06-16 11:17:25 362

原创 com.sun.jersey.api.container.ContainerException: The ResourceConfig instance

首先这个问题是新建项目运行在tomcat上时发生的,而且index.jsp可以正常显示,错误日志如下:字面意思上并不能定位到出错点,我看见了jersey这个字眼,好像在哪见过。没错,就是这,这是新建项目下WEB-INF下的web.xml自动生成的东西,而且标签说不能修改,我试着删除了蓝色的部分,再次重新启动tomcat,结果,没有异常了!好奇的去查了下JAX-RS:

2017-06-10 21:44:28 3904

原创 关于MyEclipse自带的tomcat的相关问题

1.MyEclipse里面tomcat的bin文件夹和conf文件夹是在MyEclipse安装目录的plugins里面的com.genuitec.eclipse.server.embeded.tomcat.core_13.0.0.me201406201920的tomcat70文件夹里(只需要找大体相似的,后面的数字可能会不一样)。2.当你部署了一个项目,当时是成功运行的,后来你开始了另一个项目

2017-06-08 09:05:47 6418

原创 关于Struts1、Struts2和Webwork的理解

Webwork前面记录了Struts1的使用及原理,那么WebWork又是什么呢?看一下Webwork的原理图:可以看到,当一个客户端请求到达服务器时,会先经过一系列过滤器,然后到达FilterDispatcher,ActionMapper存有action的配置信息,找到哪一个Action后,FilterDispatcher会把请求交给ActionProxy,ActionPro

2017-05-14 11:26:10 1550

原创 MyEclipse配置Tomcat和发布项目

我是用的是MyEclipse7.0 。首先, File->New->Web Project建立项目:配置Tomcat服务器:Window->Preference,然后按照下面路径找到:在这里使用6.x,把要使用的Tomcat安装路径配置好。然后添加或者修改Tomcat的jdk:然后找到工具栏上的:左边的按钮(Deploy MyEclipse J2EE Pro

2017-05-11 09:58:49 8674

原创 关于Struts框架-简单应用及原理

Struts是Apache基金组织中Jakarta项目组的一个开源项目,主要实现MVC模式,其操作的本质依然是jsp、servlet、javabean等技术的应用。关于Struts的配置首先下载开发包:解压缩,然后指定的资源文件是错误信息资源文件,ActionMessage构造方法就是根据相关key去读取资源文件中的错误内容。配置xml的意义

2017-05-10 09:30:28 4090

原创 Ajax开发

之前我们想要从服务器获取数据然后更新某一部分界面,需要刷新整个界面才行。但是有了Ajax,我们可以进行局部刷新。关于XMLHttpRequest对象,有两种创建方式:这是使用Ajax的第一步,创建XMLHttpRequest对象。Ajax不仅可以请求静态页面,也可以请求动态页面。下面实现一个登录验证的操作:返回XML数据用到的是xmlHttpReques

2017-05-09 08:28:06 212

空空如也

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

TA关注的人

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