MPAndroidChart - 常用属性

一、常用属性

参考地址:https://blog.csdn.net/qq_25943493/article/details/51803497
中文文档:https://github.com/baiqingsong/ChartDawn

// 禁止触摸/拖动/缩放
bc.setTouchEnabled(false)
bc.isDragEnabled = false
bc.setScaleEnabled(false)
//不绘制网格背景
bc.setDrawGridBackground(false)
// 处理y坐标轴
bc.axisRight.isEnabled = false // 右侧不显示Y轴
bc.axisLeft.axisMinimum = 0f //设置Y轴显示最小值,不然0下面会有空隙
bc.axisLeft.setDrawGridLines(false) //不设置Y轴水平线显示
bc.axisLeft.axisLineColor = Color.TRANSPARENT // 设置左侧y轴坐标轴线的颜色

// 处理x坐标轴
bc.xAxis.position = XAxis.XAxisPosition.BOTTOM // 设置坐标轴位置
bc.xAxis.setDrawGridLines(false) // 设置X轴竖直线的显示
// 显示每一个 X 轴的数值,第一个参数为x轴数值个数,第二个是否强制使用坐标轴数值
bc.xAxis.setLabelCount(10, false)

// 设置偏移量
bc.extraBottomOffset = 14f // 底部偏移量

// 设置描述
bc.description = Description().apply {
text = "min"
setPosition(30.toPx().toFloat(), 25.toPx().toFloat()) // 修改显示的位置
textAlign = Paint.Align.LEFT // 显示在左边/右边/中间
}

// 处理标签
val legend = bc.legend
legend.horizontalAlignment = Legend.LegendHorizontalAlignment.CENTER // 设置标签横向居中
legend.verticalAlignment = Legend.LegendVerticalAlignment.TOP // 设置标签在顶部
//背景阴影
bc.setDrawBarShadow(false)
bc.isHighlightFullBarEnabled = false
//显示边界
bc.setDrawBorders(false)
bc.setPadding(1, 1, 1, 1)
// 设置描述
bc.description = Description().apply {
text = ""
}
阅读更多

Android面试题 - LruCache

一、原理

LruCache 其实挺简单的,本质是对LinkHashMap的封装,然后通过设置maxSize来控制LinkHashMap的容量。

二、注意点

2.1 LruCache 是线程安全的

它的所有属性都是私有属性

image-20200907092730822

对私有属性的settergetter操作都是加了锁处理

image-20200907092920801
阅读更多

Android面试题 - AsyncTask

一、原理

AsyncTask 本质上是对handler和线程池对封装,在线程池中执行耗时任务,当任务完成或任务更新时,向主线程的Handler发送消息,在Handler中执行finish()onProgressUpdate()等方法。

阅读更多

优化git commit message

使用commitizen进行提交

一、初始化

npm install -g commitizen

# 然后在工程中执行下面两个初始化命令
npm init --yes
commitizen init cz-conventional-changelog --save-dev --save-exact --force

然后使用git cz替代commit

阅读更多

idea svn 无法使用

idea 出现:Can’t use Subversion command line client: svn The path to the Subversion executable is probably wrong

阅读更多

日常爬坑-指纹解锁Key permanently invalidated

最近我的个人应用KeepassA在bugly上收到了一个行奇怪的问题。

错误日志:

java.lang.RuntimeException:java.lang.reflect.InvocationTargetException
com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:549)
......
Caused by:
android.security.keystore.KeyPermanentlyInvalidatedException:Key permanently invalidated
android.security.KeyStore.getInvalidKeyException(KeyStore.java:1368)
android.security.KeyStore.getInvalidKeyException(KeyStore.java:1413)

android.security.keystore.KeyStoreCryptoOperationUtils.getInvalidKeyExceptionForInit(KeyStoreCryptoOperationUtils.java:54)
android.security.keystore.KeyStoreCryptoOperationUtils.getExceptionForCipherInit(KeyStoreCryptoOperationUtils.java:89)
android.security.keystore.AndroidKeyStoreCipherSpiBase.ensureKeystoreOperationInitialized(AndroidKeyStoreCipherSpiBase.java:265)
android.security.keystore.AndroidKeyStoreCipherSpiBase.engineInit(AndroidKeyStoreCipherSpiBase.java:109)

阅读更多

日常爬坑-指纹解锁Invalid argument

最近我的个人应用KeepassA在bugly上收到了一个行奇怪的问题,在androidQ上出现了keyStore参数异常的问题。

异常日志

java.lang.RuntimeException:java.lang.reflect.InvocationTargetException
com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:549)
......
Caused by:
android.security.KeyStoreException:Invalid argument
android.security.KeyStore.getKeyStoreException(KeyStore.java:1303)
android.security.keystore.KeyStoreCryptoOperationChunkedStreamer.doFinal(KeyStoreCryptoOperationChunkedStreamer.java:224)
android.security.keystore.AndroidKeyStoreCipherSpiBase.engineDoFinal(AndroidKeyStoreCipherSpiBase.java:506)
javax.crypto.Cipher.doFinal(Cipher.java:2055)
阅读更多

日常爬坑-Fragment传参失败

最近我的个人应用KeepassA在bugly上看到一个很奇怪的问题,activity在给fragment传参时,使用了赋值的方式,如下:

val f = FragmentA()
f.b = "sss"

某些情况下,b的属性死活拿不到,导致程序出现空指针异常。

阅读更多

gitlab 一键上传脚本

最近公司的项目将代码仓库迁移到了gitlab中,为了代码安全,gitlab中的开发分支被设置成了受保护的分支,每次提交都要走下面的流程:

本地开发分支 -> 新建临时分支 -> 将临时分支上传仓库 -> 创建合并请求 -> 删除本地临时分支 -> 切换会开发分支

每次都是如此麻烦的流程,因此便萌生了使用shell脚本完成这些机械的过程。

阅读更多

日常爬坑-android uri 生命周期问题

最近在写我的个人应用KeepassA时,遇到了android文件uri生命周期的问题,被文件真实路径的获取搞得有点懵逼。从android p开始,谷歌对文件访问的权限限制的更加变态了,如果想兼容大多数机型,使用谷歌提供的ASF框架是一个很好的选择。

但是该框架只能返回文件的uri,并不能返回文件路径,并且随着android的进一步升级,特别是从android Q 开始,已经完全无法从uri获取到文件真实路径了!!

阅读更多

沙箱机制下的应用间数据共享

通过android的沙箱机制,可以在不同的应用间共享代码、数据、或资源文件。
阅读本文前需要了解android的沙箱机制

一、代码共享


Context packageContext = createPackageContext("com.example.signatureapp", Context.CONTEXT_INCLUDE_CODE|Context.CONTEXT_IGNORE_SECURITY);

Context.CONTEXT_INCLUDE_CODE:

把参数包名对应的应用中的代码包含到Context中,这样当前应用才能访问context应用中的类,如果context对应的应用不能安全的加载到当前应用中,会报出SecurityException,如果想要加载另一个应用,访问它的数据,则这个标记必须设置

CONTEXT_IGNORE_SECURITY:忽略加载context对应的应用这个过程中的安全限制,总是允许加载,和CONTEXT_INCLUDE_CODE配合使用,代表不管是否安全,都要加载,一般使用要小心。

阅读更多

android 沙盒模型

一、Android延用的linux权限模型

1.1 android沙箱

Android 系统中,应用是在Dalvik 虚拟机实例三运行的,而每一个虚拟机都是一个独立都进程,而在linux中,每一个进程都是相互隔离的,Android 这种基于 Linux 的进程 “沙箱” 机制,是整个安全设计的基础之一。

因为Android是继承于linux,因此继承了linux用户管理的特点,并根据移动端的特点进行了优化。

Android 沙箱的核心机制基于以下几个概念:

1、标准的 Linux 进程隔离;

2、大多数进程拥有唯一的用户 ID(UID);

3、以及严格限制文件系统权限。

阅读更多