自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

赵彦军

做一只快乐的程序猿!

  • 博客(432)
  • 资源 (2)
  • 收藏
  • 关注

原创 AES加密 — 详解

转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/120285594本文出自【赵彦军的博客】AES 简介DES 全称为Data Encryption Standard,即数据加密标准,是一种使用密钥加密的块算法,1977年被美国联邦政府的国家标准局确定为联邦资料处理标准(FIPS)AES 密码学中的高级加密标准(Advanced Encryption Standard,AES),又称Rijndael加密法,是美国联邦政府采用的一种.

2021-09-14 13:47:25 30915 6

原创 Java Okio-更加高效易用的IO库

okio简介Okio是一个库,它补充了java.io和java.nio,使访问、存储和处理数据变得更加容易。OkHttp的的 io 功能就是 okio 提供的,OkHttp是Android中包含的一个功能强大的HTTP客户端。github地址:https://github.com/square/okioapi主页:https://square.github.io/okio/maven地址:https://mvnrepository.com/artifact/com.squareup.okio/ok

2021-09-09 22:00:16 1115

原创 Kotlin by属性委托

在 Kotlin 中,通过 by 实现属性委托,属性委托 是什么意思呢?简单来说,就是属性的 set、get 的操作,交给另一个对象器完成。举个例子:class Example { var p: String by Delegate()}语法是: val/var <属性名>: <类型> by <表达式>。在 by 后面的表达式是该 委托, 因为属性对应的 get()(与 set())会被委托给它的 getValue() 与 setValue() 方法。

2021-08-26 21:33:18 1153

原创 Android Annotation注解详解

文章目录Java注解元注解说明@Retention@Target通过反射获取注解信息方法使用注解方法的参数使用注解Java注解Java 注解(Annotation)又称 Java 标注,是 JDK5.0 引入的一种注释机制。Java 语言中的类、方法、变量、参数和包等都可以被标注。和 Javadoc 不同,Java 标注可以通过反射获取标注内容。在编译器生成类文件时,标注可以被嵌入到字节码中。Java 虚拟机可以保留标注内容,在运行时可以获取到标注内容 。 当然它也支持自定义 Java 标注。Jav

2021-08-24 19:59:41 1496 5

原创 Android Kotlin Coroutines ktx扩展

本篇文章主要讲的是,kotlin 协程在 ktx 上的扩展lifecycle 扩展对于 lifecycle 的扩展,已经在 以前的文章中讲过了https://blog.csdn.net/zhaoyanjun6/article/details/106413283主要的依赖implementation "androidx.lifecycle:lifecycle-runtime-ktx:2.2.0"viewModel 扩展对于 viewModel 的扩展,已经在 以前的文章中讲过了https:/

2021-08-20 20:37:49 406

原创 Android ViewModel详解

视图与数据模型之间的桥梁ViewModelViewModel的生命周期会比创建它的Activity、Fragment的生命周期都要长。即ViewModel中的数据会一直存活在Activity/Fragment中。众所周知,由于Android平台的特殊性,若应用程序发送屏幕旋转的时候会经历Activity的销毁与重建,这里就涉及到数据保存的问题。虽然Activity可以通过onSaveInstanceState()机制保存与恢复数据,但是onSaveInstanceState()方法只能存储少量的数据进行恢

2021-08-20 19:37:50 20630 1

原创 Android 应用目录分析

沙箱私有目录内部存储空间中的应用私有目录val filesDir = filesDir/data/user/0/com.example.myapplication/filesval cacheDir = cacheDir/data/user/0/com.example.myapplication/cache是 app 的私有目录,也称沙箱。App 卸载后,此目录随之删除。文件管理器无法访问,除非root。还有一种方法,把手机连到到电脑上,运行 app debug 模式,用 Android

2021-08-12 17:57:01 1105

原创 JAVA多线程中wait()方法的详细分析

最近看帖子,发现一道面试题:启动两个线程, 一个输出 1,3,5,7…99, 另一个输出 2,4,6,8…100 最后 STDOUT 中按序输出 1,2,3,4,5…100题目要求用 Java 的 wait + notify 机制来实现,重点考察对于多线程可见性的理解。wait 和 notify 简介wait 和 notify 均为 Object 的方法:Object.wait() —— 暂停一个线程Object.notify() —— 唤醒一个线程从以上的定义中,我们可以了解到以下事

2021-08-12 16:15:03 7506 2

原创 JAVA多线程中join()方法的详细分析

虽然关于讨论线程join()方法的博客已经非常极其特别多了,但是前几天我有一个困惑却没有能够得到详细解释,就是当系统中正在运行多个线程时,join()到底是暂停了哪些线程,大部分博客给的例子看起来都像是t.join()方法会使所有线程都暂停并等待t的执行完毕。当然,这也是因为我对多线程中的各种方法和同步的概念都理解的不是很透彻。通过看别人的分析和自己的实践之后终于想明白了,详细解释一下希望能帮助到和我有相同困惑的同学。首先给出结论:t.join()方法只会使主线程(或者说调用t.join()的线程)进入等

2021-08-11 18:16:40 556 1

原创 Android NDK学习笔记6:异常处理

JNI捕获异常如果 JNI 调用 java 代码,Java 代码发生发生异常,会发生什么情况举例:class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) find

2021-08-09 21:37:18 619

原创 Android NDK学习笔记5:引用类型管理

在 JNI 中,有三种引用类型全局引用局部引用弱引用局部引用在方法中定义的局部引用,可以不用手动释放,在程序运行结束后,会自动释放。但是有一种情况,比如在方法中有 for 循环,如果产生大量的局部引用,会占用大量内存。所以一种比较好的编程习惯就是,产生的局部变量,一旦不再使用,就手动释放一下。void DeleteLocalRef(jobject localRef)举例说明:extern "C"JNIEXPORT void JNICALLJava_com_example_myapp

2021-08-09 20:13:24 308

原创 Android NDK学习笔记4:JNI访问Java构造函数

JNI 访问 Java 的构造函数,有两种写法//第一种 env->NewObject(cls, init);//第二种方式一:NewObjectUtil.java 类public class Util { int age = 100; //这个方法 c 调用,创建对象 public Util() { Log.d("util-", "init"); }}在 Activity 中声明 getUtil 方法。如下:class

2021-08-03 14:01:23 1135

原创 Android NDK学习笔记3:JNI访问Java属性、方法

JNI 访问属性创建 Util.java 类/** * @author : zhaoyanjun * @time : 2021/7/29 * @desc : */public class Util { String usernName = "zhaoyanjun"; int age = 10; static float key = 2f; //修改类string属性 native void changeNameValue(); //修改类i

2021-07-29 19:55:28 510

原创 Android NDK学习笔记2:数组

java数组和jni数组对应关系kotlinjniIntArrayjintArrayDoubleArrayjdoubleArrayLongArrayjlongArrayCharArrayjcharArrayShortArrayjshortArrayArrayjobjectArray //kotlin external fun arrayInt(array: IntArray): String external fun array

2021-07-27 21:15:43 375 3

原创 Android NDK学习笔记1:基础

什么是Android NDKNDK 官网:https://developer.android.google.cn/ndk/index.htmlAndroid NDK 是一个工具集,可让您使用 C 和 C++ 等语言以原生代码实现应用的各个部分。对于特定类型的应用,这可以帮助您重复使用以这些语言编写的代码库。下载NDK1、下载 NDK ,下载完成后,下载的目录在 android sdk 目录里面/Users/xmly/Library/Android/sdk/ndk除此之外,你还可以自由下载

2021-07-27 20:01:50 400

原创 Android属性动画 实战-视差动画

效果图先看看效果图:从效果上看就是布局文件从从屏幕右侧飞入屏幕内,但不是一起飞入,而是有视差效果。实例代码我们先写布局:<?xml version="1.0" encoding="utf-8"?><androidx.appcompat.widget.LinearLayoutCompat xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.a

2021-07-21 21:17:28 421 2

原创 Android属性动画 Keyframe

KeyFrame 主要用于自定义控制动画速率,KeyFrame 直译过来就是关键帧。而关键帧这个概念是从动画里学来的,一个关键帧必须包含两个原素,第一时间点,第二位置。所以这个关键帧是表示的是某个物体在哪个时间点应该在哪个位置上。比如我们要让一个球在 30 秒时间内,从(0,0)点运动到(300,200)点,那 flash 是怎么来做的呢,在 flash 中,我们只需要定义两个关键帧,在动画开始时定义一个,把球的位置放在(0,0)点;在 30 秒后,再定义一个关键帧,把球的位置放在(300,200)点。

2021-07-21 13:53:32 1051 1

原创 Android属性动画 PropertyValuesHolder

PropertyValuesHolderPropertyValuesHolder这个类的意义就是,它其中保存了动画过程中所需要操作的属性和对应的值。我们通过ofFloat(Object target, String propertyName, float… values)构造的动画,ofFloat()的内部实现其实就是将传进来的参数封装成 PropertyValuesHolder实例来保存动画状态。在封装成 PropertyValuesHolder实例以后,后期的各种操作也是以PropertyValues

2021-07-21 11:42:39 837 2

原创 Android属性动画 TypeEvaluator

转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/118913435本文出自【赵彦军的博客】文章目录TypeEvaluatorTypeEvaluator那么TypeEvaluator的作用到底是什么呢?简单来说,就是告诉动画系统如何从初始值过度到结束值。我们在上一篇文章中学到的ValueAnimator.ofFloat()方法就是实现了初始值与结束值之间的平滑过度,那么这个平滑过度是怎么做到的呢?其实就是系统内置了一个Float.

2021-07-19 20:51:02 321 3

原创 Android属性动画 XML

使用XML编写动画我们可以使用代码来编写所有的动画功能,这也是最常用的一种做法。不过,过去的补间动画除了使用代码编写之外也是可以使用XML编写的,因此属性动画也提供了这一功能,即通过XML来完成和代码一样的属性动画功能。通过XML来编写动画可能会比通过代码来编写动画要慢一些,但是在重用方面将会变得非常轻松,比如某个将通用的动画编写到XML里面,我们就可以在各个界面当中轻松去重用它。如果想要使用XML来编写动画,首先要在res目录下面新建一个animator文件夹,所有属性动画的XML文件都应该存放在这

2021-07-19 20:19:22 868

原创 Android属性动画 监听器、翻转、暂停和恢复

监听器在很多时候,我们希望可以监听到动画的各种事件,比如动画何时开始,何时结束,然后在开始或者结束的时候去执行一些逻辑处理。这个功能是完全可以实现的,Animator类当中提供了一个addListener()方法,这个方法接收一个AnimatorListener,我们只需要去实现这个AnimatorListener就可以监听动画的各种事件了。大家已经知道,ObjectAnimator是继承自ValueAnimator的,而ValueAnimator又是继承自Animator的,因此不管是ValueAni

2021-07-19 20:00:21 2951

原创 Android属性动画 AnimatorSet

AnimatorSet实现组合动画功能主要需要借助AnimatorSet这个类.playTogether多个动画一起执行。var myView: Button = findViewById(R.id.bt)var rotation = ObjectAnimator.ofFloat(myView, "rotation", 0f, 360f)var translationX = ObjectAnimator.ofFloat(myView, "translationX", 0f, 360f)va

2021-07-15 21:04:47 2132 5

原创 Android属性动画 ObjectAnimator

转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/118709616本文出自。

2021-07-13 20:30:28 4540 3

原创 Android属性动画 ValueAnimator

文章目录ValueAnimator例子1: 透明度渐变例子2:倒计时ValueAnimatorAnimator 是一个抽象类public abstract class Animator implements Cloneable { public void start() { } public void cancel() { } public void end() { } ......}ValueAnimatorpublic class ValueAnima

2021-07-13 19:55:41 1246

原创 Android属性动画 Interpolator

转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/118683683本文出自【赵彦军的博客】文章目录InterpolatorTimeInterpolatorInterpolatorBaseInterpolator分类Interpolator通俗易懂的说,Interpolator负责控制动画变化的速率,使得基本的动画效果能够以匀速、加速、减速、抛物线速率等各种速率变化。动画是开发者给定开始和结束的“关键帧”,其变化的“中间帧”是有系.

2021-07-12 21:03:05 565 6

原创 Android属性动画 ViewPropertyAnimator

转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/111650621本文出自【赵彦军的博客】ViewPropertyAnimatorViewPropertyAnimator是在3.1系统中加入的,ViewPropertyAnimator跟ObjectAnimator很像,也能改变View的实际值,但是ViewPropertyAnimator只能作用于View而不能作用于其他object。假如需要同时对多个属性执行动画时,ViewPro.

2021-07-12 19:53:53 508 2

原创 Android Kotlin Exception处理

Kotlin 的异常和 Java 的一样, try…catch…finally代码块处理异常,唯一一点不同是:Kotlin 的异常都是 Unchecked exceptions。checked exceptions 是必须在方法上定义并且处理的异常,比如 Java 的 IoException。@Throws(IOException::class)fun createDirectory(file: File) { if (file.exists()) throw IOExcept

2021-07-05 11:05:07 1654

原创 Android Kotlin 协程async

转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/118085035本文出自【赵彦军的博客】往期精彩文章Android Coroutines ChannelsKotlin实战指南二十:flowKotlin实战指南十六:Synchronized、Volatile文章目录measureTimeMillis 统计一段代码耗时使用默认顺序使用 async 并发惰性启动的 async构建async 风格的函数measureTimeMil.

2021-06-21 20:38:20 4005

原创 Android Kotlin协程和Retrofit结合使用

Retrofit 正常使用先定义实体类class Repo(val id: String, val name: String)定义接口interface GitHubService { @GET("users/{user}/repos") fun listRepos(@Path("user") user: String?): Call<List<Repo>>}使用class MainActivity : AppCompatActivity() {

2021-06-21 14:16:56 1767 1

原创 Android 监听APP进入前台、后台

文章目录方案一:利用ActivityLifecycleCallbacks监听所有activity的生命周期方案二:ProcessLifecycleOwner方案一:利用ActivityLifecycleCallbacks监听所有activity的生命周期import android.app.Activityimport android.app.Applicationimport android.os.Bundle/** * @author : zhaoyanjun * @time : 202

2021-06-17 11:57:39 2124

原创 Android Coroutines Channels

channels 可以干啥channels用于协程间的通信, 允许我们在不同的协程间传递数据(a stream of values).数据模型生产者-消费者模式发送数据到channel的协程被称为producer, 从channel接受数据的协程被称为consumer.当需要的时候, 多个协程可以向同一个channel发送数据, 一个channel的数据也可以被多个协程接收.当多个协程从同一个channel接收数据的时候, 每个元素仅被其中一个consumer消费一次. 处理元素会自动将其从ch

2021-06-08 13:32:51 531 3

原创 Kotlin实战指南二十:flow

flow 是啥按顺序发出值并正常完成或异常完成的冷流异步数据流flow咋用? flow { emit(1) //发射数字 1 emit(2) //发射数字 2 }.collect { //接收结果 Log.d("flow-", "value $it") }如果你这样写就会报错意思是:collect 方法是 suspend 修饰的挂起函数,只能在协程里,

2021-05-28 18:19:45 2043

原创 Kotlin实战指南十九:use 函数魔法

转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/117365712本文出自【赵彦军的博客】文章目录往期精彩文章use函数往期精彩文章Kotlin实战指南十七:JvmField、JvmStatic使用Kotlin实战指南十六:Synchronized、VolatileKotlin实战指南十五:协程泄漏本文章转载于:Kotlin use函数的魔法use函数实现了Closeable接口的对象可调用use函数use函数会自动.

2021-05-28 16:48:18 2827

原创 Kotlin实战指南十八:open、internal 关键字使用

文章目录open关键字internal关键字open关键字在java中允许创建任意的子类并重写方法任意的方法,除非显示的使用了final关键字进行标注。而在kotlin的世界里面则不是这样,在 kotlin 中它所有的类默认都是final的,那么就意味着不能被继承,而且在类中所有的方法也是默认是final 的,那么就是 kotlin 的方法默认也不能被重写。那么想在 kotlin 中继承父类应该怎么做呢?为类增加open,class就可以被继承了open class Person{

2021-05-28 16:12:24 3255

原创 Kotlin实战指南十七:JvmField、JvmStatic使用

@JvmFieldJvmField 是针对kotlin 字段来说的,有两重意思:消除了变量的getter与setter方法把变量用 public 暴露出来class Util { val age = 1}转换成 java 类public final class Util { private final int age = 1; public final int getAge() { return this.age; }}可以看到,a1 是私有

2021-05-11 20:57:17 3735

原创 Kotlin实战指南十六:Synchronized、Volatile

文章目录如何创建线程如何创建线程在Kotlin 中,我们仍然可以使用 java 的语法创建一个线程Thread(Runnable { }).start() //或者使用 Lambda 表达式Thread {}.start() 事实上,kotlin 为我们提供了一个简单写法:Kotlin中可以使用thread()方法创建新的线程,指定的语句块将在新线程中运行。语法简单,十分易用。fun main() { thread { Log.d("ya

2021-04-29 14:29:13 16801

原创 Androidx ViewPager+Fragment 懒加载

这里写自定义目录标题前言懒加载(预加载)传统模式Androidx欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入前言还有一个月就过年了,超级开心。本文所有内容已经上传至github:htt

2021-02-02 14:43:51 1818 1

原创 Android 如何正确统计页面停留时长

在Android中经常有统计页面停留时长的需求,先看看以前的实现代码:class MainActivity2 : AppCompatActivity() { var startTime:Long = 0 override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main2)

2021-01-12 20:29:10 2682

原创 Android 打造异常崩溃捕获工具

Thread.dumpStack()打印当前线程调用堆栈, 这个在调试时特别好用,举例如下:Util.javapublic class Util { public static void print(){ Thread.dumpStack(); }}MainActivity.javaclass MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: B

2021-01-11 20:16:37 1026 3

原创 Android 如何做一次内存泄漏大排查

前言眼瞅着还有一个月就过年,项目也没有那么忙了,技术老大要求做一做性能优化方面的工作。而我的任务就是把项目中的内存泄漏撸一遍,然后安排对应的人处理。说到内存泄漏,我也算是老手了,其实在 2016 年我就写个内存泄漏方面的文章:Android 如何有效的解决内存泄漏的问题把内存泄漏的地方找出来说干就干,首要的任务就是把内存泄漏的代码揪出来,我选择 leakcanarygithub 地址:https://github.com/square/leakcanary/关于 leakcanary 的介绍

2021-01-07 21:11:46 1546 2

Pepk 签名压缩工具

Android app 签名生成工,执行完命令,会生成 output.zip , 然后把 output.zip 上传即可,非常好用

2020-04-16

XShell+XFtp

灵活、轻便的SFTP/FTP客户端 通过Xftp 5在网络中安全传输文件,实现多窗口 编辑,进行文件同步。

2018-02-26

空空如也

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

TA关注的人

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