自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 okhttp3使用总结

1. 简介2. API总结3. 使用案例以下例子均来源于官网。3.1 同步Get请求通过Get请求去服务器上获取helloworld.txt的文本内容:private final OkHttpClient client = new OkHttpClient();public void run() throws Exception { Request request = new Request.Builder() .url(

2021-04-16 19:25:12 6561

原创 Android布局性能优化

布局是Android应用中能直接影响到用户体验的关键部分,如果使用不当,可能会导致应用界面卡顿并且占用大量的内存。因此我们在编写布局时应该注意如下几点:优化布局的层次结构 通过<include />重复使用布局 通过<ViewStub />实现按需加载视图1. 优化布局的层次结构编写布局时,我们应该遵循如下规则,防止给系统测量布局带来额外的计算量,从而造成UI卡顿或占用内存过多的情况出现:(1)尽量展平布局,避免出现视图嵌套过深的情况;(2)尽量避免使用la

2021-04-15 16:39:46 226

原创 onSaveInstanceState和onRestoreInstanceState

假设当前应用从Activity(A)跳转到Activity(B),此时不可见不可交互的Activity(A)会经过如下的生命周期:onPuase -> onStop,Activity(A)并没有完全被销毁。如果我们从Activity(B)通过物理返回键回到Activity(A),会经过如下的生命周期:onRestart -> onStart -> onResume。我们会发现Activity(A)中的一些状态都还在(比如用户在输入框中输入的文本信息等)。但是如果系统内存不足,处于不

2021-04-14 16:47:17 241

原创 Android Handler消息机制详解(附带源码)

Handler消息机制主要涉及到四个类:Handler、Looper、MessageQueue以及Message。下面将介绍基本概念,并通过源码来深入讲解其原理(源码版本:Android 11.0(R,30))。1.基本概念:1.1 Looper循环者Looper:Looper是安卓消息循环的核心,它主要有以下职责:负责创建并维护消息队列(MessageQueue mQueue); 关联调用线程(执行Looper.prepare方法的线程); 在关联的线程中启动消息循环(message

2021-04-13 17:17:13 296

原创 Android无线调试

1. 确保手机和电脑连接在同一个局域网中;2. 在手机中查看局域网内分配的ip地址;3. 使用命令:adb connect "192.168.0.111"一般情况下都能够正常的连接上,如果出现提示:“cannot connect to 192.168.0.111:5555:用于目标计算机拒绝,无法连接。(10061)”。此时我们可以通过数据线将手机与电脑相连,通过如下命令重置端口:adb tcpip 8888。成功之后,断开手机与电脑的连接,然后使用如下命令:adb connect "1

2021-04-12 20:11:22 333

原创 Android滚动视图Scroller

在开发过程中,我们往往需要通过自定义View来实现平滑滚动的视图,这就需要用到Scroller了。在具体介绍Scroller之前,先讲解一下相关的基础知识,比如:坐标系,scrollTo()方法,scrollBy()方法,getScrollX()方法和getScrollY()方法。一. 基础知识1. 坐标系Android中有两种坐标系,根据坐标原点的不同代表不同的含义,分别是Android坐标系(绝对坐标系)和视图坐标系(相对坐标系)。Android坐标系中的坐标原点是屏幕左上角的顶点,而视图坐

2020-07-04 15:30:56 985

原创 Android触摸事件分发机制

本文总结自这篇博客。1. 事件基础事件分发过程中的对象:Touch事件(当用户触摸屏幕时(View或ViewGroup派生的视图控件),将产生点击事件)。Touch事件的相关细节被封装到MotionEvent对象中(发生触摸的位置、时间等)。事件类型:(1)MotionEvent.ACTION_DOWN:按下手指(事件开始);(2)MotionEvent.ACTION_MOVE:手指移动;(3)MotionEvent.ACTION_UP:抬起手指(事件结束);(4)Motio

2020-07-03 16:08:39 415

原创 Java基础之枚举类型

在Java引入枚举类型之前,我们常常通过抽象类的方式定义全局常量,例如:public abstract class UploadStatus { public static final int UPLOAD_IN_PROGRESS = 0; public static final int UPLOAD_FAILED = 1; public static final int UPLOAD_SUCCEEDED = 2;}现在我们可以使用枚举类型来定义:enum Uplo

2020-06-23 17:22:33 934 1

原创 Maven构建java项目

Maven是Java项目的管理及自动构建工具,基于项目对象模型(POM)。构建相关的配置文件及依赖等都保存在pom.xml中。下面将简单介绍一下如何使用Maven构建java项目。1. Maven下载及配置(以Mac为例)(1)从官方网站下载最新压缩包,笔者当前下载的是apache-maven-3.6.3的版本;(2)解压到/usr/local/maven路径下;(3)为了能够在控制台使用mvn命令,需要配置环境变量;首先运行如下命令:vim ~/.bash_profile然后按下

2020-06-22 20:51:36 245

原创 Java序列化和反序列化对象

Java中的序列化对象是指将内存中的对象转换成字节流的形式,以方便保存(写入文件、数据库)和传输。反序列化对象则是相应的逆过程,将从文件或数据库或网络中获取到的字节流重新构造成序列化前的对象实例并写入到内存中,这使得我们可以在程序运行过程中使用该对象。如果想要某个类的实例能够序列化成字节流的形式,那么这个类需要实现java.io.Serializable接口(Serializable接口是一个标记接口,没有任何的属性和方法,只是专门用来标记某个类实例化后的对象是可序列化的,java中类似的标记接口还有C

2020-06-18 19:46:41 263

原创 Android集成google license(License Verification Library)

当我们的应用上架google应用市场时,可能希望应用在被授权后才能使用。因此Google play为我们提供了许可服务,借助该服务,应用可以在运行时查询google play服务器,获取当前用户的许可状态,APP可以根据具体的情况禁止或允许用户进一步使用。以下是官方文档的链接:应用许可。本博客的重点在于如何集成官方提供的License Verification Library,来实现权限验证。1. 设置发布账号,并生成应用的许可公钥;2. 下载LVL;git clone https://g

2020-06-15 20:07:00 1457

原创 Service使用总结

1. 定义一个服务:public class MyService extends Service { public MyService() { } @Override public IBinder onBind(Intent intent) { } @Override public void onCreate() { super.onCreate(); } @Override pu

2020-06-11 18:02:35 449

原创 Android应用更新(一)

在开发App后期,一个肯定绕不过去功能:应用更新。无非就两种形式:(1)服务端维护更新包,app后台下载最新包并安装;(2)app上架各应用市场后,服务端只提供一个接口告知app当前最新app的版本号,更新信息等。app拉起本地应用市场或者是通过浏览器打开指定更新链接;方式一应该是比较主流的方式,对于App和服务端相对来说都要麻烦一些,但是好处是用户体验更好。方式二则更加的省事。本博客将介绍方式二如何实现,方式一将在以后的文章中介绍。方式二更新的思路:(1)遍历当前手机所有已安装包,

2020-06-09 11:51:48 1445

原创 Java代码风格规范

本文的代码规范均总结自《码出高效 Java开发手册》。1. 命名规约:(1)命名符合本语言特征;(2)命名体现代码元素特征:OOP代码元素的命名形式分为两大类,首字母大写的大驼峰UpperCamelCase和首字母小写的小驼峰lowerCamelCase。类名采用大驼峰的形式,一般为名词,例如:Object、StringBuffer等 方法名采用小驼峰形式,一般为动词,与参数组成动宾结构 变量包括参数、成员变量、局部变量等,也采用小驼峰的形式 常量需要全部大写,单词之间使用下划线连

2020-06-08 22:58:32 611

原创 Java面向对象知识点总结

本文总结自《码处高效:Java开发手册》。迪米特法则:即A模块使用B模块的某个接口行为,对B模块中除此行为之外的其他信息知道的尽可能少(强调封装,解耦)。里氏代换原则:任何父类能够出现的地方,子类都能够出现(继承,is-a)。在不知道什么样的访问控制权合适时,优先采用private控制级别。谨慎使用继承,滥用继承的危害包括方法污染和方法爆炸:(1)方法污染:父类具备的行为,通过继承传递给子类,但子类并不具备执行此行为的能力。(2)方法爆炸:继承树不断扩大,底层类拥有的方法虽然都能够执

2020-06-08 17:50:58 277

原创 Android jni使用及native层代码调试

在工作中有个需求需要集成后端用C语言编写的p2p模块,并在java层调用native层的代码,这在安卓中需要通过jni来完成,下面将介绍如何在项目中使用jni。1. 安装相关sdk安卓提供了ndk帮助我们编译native层的C代码,因此我们需要确保sdk中已经下载如下工具:上图中的LLDB可以帮助我们调试集成的C代码,这里还是建议安装一下。安装成功后,需要在local.properties文件中添加下载的ndk绝对路径,例如:ndk.dir=/Users/everglow/Libr

2020-06-04 15:16:18 2978

原创 Android平台编译Pjsip

1. 下载并解压最新的代码pjproject-2.10.tar.gz;2. 设置编译NDK路径,例如:export ANDROID_NDK_ROOT=/Users/everglow/Library/Android/sdk/ndk/21.0.61136693. 创建config_site.h并放到路径pjlib/include/pj/下#define PJ_CONFIG_ANDROID 1#include <pj/config_site_sample.h>4. 编辑p

2020-06-02 20:53:40 935

原创 消息推送——FCM集成与测试

在开发应用中,往往避免不了需要使用消息推送的功能,本文将具体介绍Google Firebase Messaging在安卓端的集成与使用。集成FCM的步骤如下:(1)使用Google账号登录Firebase,并注册App,注册成功后,需要下载对应的配置文件google-services.json,并放到项目的app目录下;(2)在项目根目录下的builde.gradle文件中,确保添加如下内容:buildscript { repositories { google()

2020-05-30 11:52:22 6993 3

原创 React——为什么我们要写super(props)

本文总结自Dans的博客。在编写react类组件的过程中,下面constructor中的代码我们应该已经见过无数次,但是却没有思考过为何必须这么去写:class Example extends Component { constructor(props) { super(props); this.state = {}; }}在出现类属...

2020-05-04 15:53:31 619

原创 React是如何区分Class和Function的?

本文总结自Dan Abramov的博客。React中提供了类组件和函数式组件的两种写法,那么React中是如何去判断某个组件是类组件还是函数式组件的?本文将给出解答。以Greeting组件为例,两种定义方式如下:类组件:class Greeting extends React.Component { render() { return ( ...

2020-05-04 13:33:06 933

原创 React Native获取及监听网络状态——Android篇

开发应用过程中,我们往往需要获取/监听手机的网络状态,而RN提供的NetInfo api随着sdk的升级往往会出现许多的问题。所以本文将介绍如何按需自行编写获取手机网络状态的原生代码。对于网络相关的功能,往往涉及到以下几个部分:1. 主动获取手机的连接状态(是否联网,连接的是移动蜂窝网还是WiFi);2. 监听网络变化(蜂窝网、WiFi、网络断开连接等),执行相应的操作(例如提示用户)...

2020-04-12 16:00:29 3664

原创 React Native实现圆形进度条

React Native实现自定义的圆形进度条动画,主要需要用到Animated和react native svg这个插件。先看看最终实现的效果:大致思路如下:1. 使用Svg创建画布,指定画布的宽高;2. 创建外层倒计时Circle,这里需要使用两个完全重合的Circle叠起来实现,这两个Circle都只保留边框,其中一个Circle显示为进度条背景色(上图中的灰色),另一个Ci...

2020-04-12 11:08:52 3431 1

原创 React Native多语言切换

React Native多语言切换应该是一个比较常见的需求,具体可以分为两种方式:1. 识别手机系统语言,app自动加载相应的语言文件;2. 允许用户在App内手动切换语言,这种情况并不需要保证App语言与手机系统语言一致;下面就来介绍一下这两种方式如何完成,在介绍之前先声明一下本人目前开发所使用的react native版本是0.61.5,且使用的是react hook语法进行组件的...

2020-03-26 17:34:58 6811 2

原创 React Native release包无法正常发起http请求的问题

最近在开发阶段,你可能会发现一个奇怪的问题,在部分高系统版本的手机上release包无法正常获取数据,但是debug模式下却可以。这实际上是Android对于不安全的http请求的限制,在开发过程中,后端提供给我们的接口往往是内网ip,并且没有使用证书进行加密。为了能够在release包中正常的发起http请求,我们只需要在配置文件中添加一定的配置即可:Android:AndroidMan...

2020-03-25 17:52:49 2381

原创 React Native release包全局错误处理——iOS篇

在这篇博客中,介绍了如何在Android中处理release包的错误。这篇文章将介绍一下如何在iOS中进行错误信息收集。由于debug包的错误可以直接在Xcode的日志窗口中查看,因此我们只讨论如何在release包中收集错误日志。还是分为两种情况进行讨论:1. JS异常依旧是封装一个全局捕获JS异常的组件,实现componentDidCatch生命周期方法,将获取到的js异常栈信息写...

2020-03-25 16:49:26 519

原创 React Native release包全局错误处理——Android篇

当我们在开发React Native应用时,如果在调试状态下,获取错误的异常信息是非常简单的,JS异常会立即在真机上显示(或者打开调试模式在浏览器控制台中显示),原生层的java闪退异常则可以通过Android Studio的Logcat进行查看。但是当我们将应用打包成apk包,并提交测试的时候,一旦出现异常或闪退都会比较棘手。如果复现步骤简单可能还好,我们可以尝试在开发环境下复现,可是一旦碰...

2020-03-15 00:36:21 1242 1

原创 React Native集成原生代码

尽管React Native官方提供了许多原生api简化我们的开发流程,但是在实际开发过程中,往往需要我们自行封装原生代码供RN层进行调用,本文将分Android和iOS平台简单介绍具体流程。Android:假如我们想要原生提供一个方法,将JS抛出的异常写入到本地(这有助于我们在release包中迅速的定位问题的原因),首先我们需要创建一个继承自ReactContextBaseJavaMo...

2020-03-14 23:41:04 500 1

原创 React Native实现沉浸式状态栏(兼容Android和iOS)

实现沉浸式状态栏的关键就是使用RN官方提供的StatusBar。实现步骤可以分为以下两步:(1)自定义StatusBar的行为;(2)在自定义Header中使用封装好的StatusBarComp;在开始实现前,需要明确一点,StatusBar在两个平台上的表现是有差异的。首先,在项目中,为了Header的自由度,我往往会自定义一个Header组件,而不是使用react-navigati...

2020-03-14 12:49:43 4310

原创 React Navigation 5.0总结

react navigation是使用react native开发APP需要用到的路由库,最近出了5.0版本,相较于之前提供的api使用上有较大的区别,特别是路由的配置方式由静态路由改为动态路由的方式。本文记录一下...

2020-03-13 23:08:44 3315

原创 React Hook概念总结

React Hook是React 16.8中的新特性。它可以让你在不编写class组件的情况下使用state以及其他React特性(增强了函数式组件的功能)。本文是基于React官网中对于Hook这一特性介绍的总结,建议大家可以先移步官网查看相关内容。1. state hook(状态钩子)import React, { useState } from "react";functi...

2020-03-07 23:13:38 489

原创 Java设计模式之单例模式

单例模式:保证一个类仅有一个实例。java中的单例模式共有以下几种写法:1. 饿汉模式public class Singleton { private static Singleton instance = new Singleton(); private Singleton () { } public static Singleton getInstan...

2020-03-05 00:05:28 102

空空如也

空空如也

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

TA关注的人

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