自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

你好,开发者

请移步公众号「开发者如是说」

  • 博客(164)
  • 收藏
  • 关注

原创 Android 项目打包 api-versions.xml Stream closed

看错误的内容详情是读写 api-versions.xml 这个文件失败了,../android-sdk/platform-tools/api/api-versions.xml java.io.IOException: Stream closed可以到该目录下面检查该文件是否存在,是 platform-tools 版本问题,比如 29.0.3 上面解压之后存在 api 这个目录,30.0.3 上面就不存在这个目录。解决的一个办法是到官方仓库下载这个文件:https://androidsdkmanage

2022-05-06 16:19:13 2238

原创 当 Adapter 遇上 Kotlin DSL,无比简单的调用方式

早在去年的时候我就提到过使用工厂的方式获取 Adapter 而不是为每个 Adapter 定义一个类文件。这样的好处是,对于不是那么复杂的 Adapter 可以节省大量的代码,提升开发效率和解放双手,同时更好的支持多类型布局效果。1、Kotlin DSL 和 Adapter 工厂方法可以把 Kotlin DSL 当作构建者使用。这里有一篇不错的文章,想了解的可以阅读下,https://www.ximedes.com/2020-04-21/kotlin-dsl-tutorial/Kotlin DS

2021-09-11 23:02:17 304

原创 异步、非阻塞式 Android 启动任务调度库

1、背景节前面试的时候被问到 Android 启动任务依赖怎么做调度。当时随口给了一个方案,后来想想觉得有意思就自己花了一天的时间写了一个。这个库已经开源到 Github 上面:https://github.com/Shouheng88/AndroidStartup在写这个库之前只是看了下 Jetpack 的 Startup. 毕竟,如果这个库已经非常完善了,那么我就没必要自己再搞一个了。截止目前,在我看来,这个库最大的缺点是,这个库所有的任务都在主线程中触发并执行,而我们为了优化启动的性能通常会将任

2021-05-05 17:40:15 343

原创 BitmapPool 了解吗?Glide 是如何实现 Bitmap 复用的?

highlight: agate这个问题实际上是我前几天面试时遇到的一个问题,虽然我之前分析过 Glide 的源码,但是老实说,如果不是面试遇到这类问题,我根本不会留意 Glide 的 Bitmap 复用这块…不管怎么说,遇到了这个问题,我们就来看下 Glide 是如何实现 Bitmap 复用的吧~1、“池化”以及对象复用其实,说起“池化”以及对象复用,在 Android 中例子还是有这么几个的。典型的比如 Handler 中的 Message. 当我们使用 Message 的 obtain 获取消.

2021-04-16 12:22:09 540

原创 建议收藏,从 jCenter 迁移到 MavenCentral 完整方案

发布到 Maven Central 相关的教程挺多的,但是大部分存在问题。这篇文章是我在解决了很多问题的基础之上总结的,用来帮助需要的同学避免重蹈覆彻。需要的可收藏,万一用到了呢~1、Farewell to Bintray jCenter首先,告别下 bintray jcenter. 相比于 Maven Central,bintray jcenter 的性能和方便性确实好得多。可惜,jcenter 将要关闭了。jcenter 还是给我提供了很多的便利,对于其关闭深表可惜:2、发布到 Maven Ce

2021-04-15 10:46:44 1677 1

原创 个人从零开发一款 Android 应用、上线并盈利 | 项目复盘

最近个人开发的一款应用 言叶 刚刚发布了 1.4.0,至此,我想要开发的大部分功能已经完成了。本来我也想做一次复盘,刚好趁这个机会分析下并发出来。在这篇文章中,我想分析的并不仅仅是技术,除此此外,我也会分析下这个产品、开发过程中有哪些做得好和不好的地方以及接下来的打算。1、项目背景这个应用是一款笔记应用。其实,一开始要做它,我也是拒绝的。因为我觉得这类应用门槛和天花板都比较低,同类和类似的应用都比较多,花费功夫做一个收益也不会太大。后来打算做是出于几个原因:第一,我大概写了三周的电商爬虫并部署到.

2021-03-20 22:32:11 1114 1

原创 拥抱新的交互方式,在 Android 中应用 MVVM

1、个人的开源库不知不觉维护自己的几个开源库已经快两年了,现在我已经成功地将它们应用到了我的多个产品上面,比如 言叶。通过使用这些开源库能够大大降低开发的复杂度,为我节省大量的代码,提高效率。前些日子忙着做应用的新特性,现在终于有了些许时间。这里介绍下我的开源库,以及我做个人开发过程中如何通过新特性和技巧简化开发的。其实之前我也写了很多文章了介绍自己的设计了,这应该是最后一篇了吧,所以尽可能做到集大成吧。2、JetpackGoogle 最新推出的 Jetpack 里出了很多好玩的框架,这里我的 V

2021-03-04 18:14:52 285 3

原创 java.lang.ClassCastException: android.widget.HeaderViewListAdapter cannot be cast to a.c.h.f.a.k at

异常记录,一个系统层面的错误错误堆栈如下,java.lang.ClassCastException: android.widget.HeaderViewListAdapter cannot be cast to a.c.h.f.a.k at a.c.h.g.va$a.onKeyDown(SourceFile:9) at android.view.KeyEvent.dispatch(KeyEvent.java:2929) at android.view.View.dispatchKeyEvent(V

2021-01-13 16:22:11 226

原创 为你的应用集成谷歌结算(客户端集成+服务端校验)

最近在开发自己的一款新产品 言叶,上架到谷歌商店之后有国外用户反馈想要使用谷歌支付,于是我准备为自己的应用集成谷歌结算以允许用户进行内购付款。之前我完全没用集成过谷歌支付,从寻找到的一些资料来看,谷歌结算的开发方式已经做了调整,新的开发方式比之前使用 AIDL 开发要简单一些。1、客户端集成1.1 文档资料对于客户端集成,官方文档已经给了比较详尽的说明,这里对应的文档资料提供一下:库集成文档《将 Google Play 结算库集成到您的应用中》,链接:https://developer.andr

2020-12-21 16:04:51 1344 7

原创 Android Studio 错误记录:If you already have a 64-bit JDK installed ,defined a JAVA_HOME variable..

Android Studio 启动的时候报错,错误详情如下:If you already have a 64-bit JDK installed ,defined a JAVA_HOME variable in Computer>System Properties>System Settings>Environment Variables Failed to create JVM .JVM Path: xxxx可以使用 java -version 查看是否是 jdk 的位数问题,另外检

2020-10-12 15:28:18 4310 5

原创 个人开源库的一些更新,兼谈Jetpack和Kotlin给Android开发带来的变化

前段时间,我开发完成了新的软件 移动工具箱。最近,我准备把开发过程中总结的一些东西沉淀到自己个人开源的几个库中。最新的一些更新中运用了 Kotlin 和 Jetpack 的一些语法特性,故此总结一下。Jetpack 和 Kotlin 出来已经很久了,然而很多应用开发还停留在 MVP 以及 Java 阶段,即便使用了 Kotlin,很多人只不过是像使用 Java 一样在使用 Kotlin. 实际上,如果能够结合 Kotlin 和 Jetpack 的语法特性,可以大大提升我们日常开发的效率。下面,我以个人开源库

2020-10-11 23:35:48 331

原创 从零搭建基于 Java 的服务器生产环境

之前的文章介绍了我最近开发的一款工具软件 移动工具箱,然而安装包放在华为应用市场上面,如果不安装华为应用市场就无法下载软件,无奈,只能自己从零搭建一个服务器来进行应用的宣传和下载。搭建一个服务器是很简单的,这里我们将服务器的要求提高一些,以对标 “生产” 的标准进行要求,要做的东西比较多,故作此文,加以记录。首先说下环境,腾讯云,CentOS 7.5 64 位,服务器采用 Java 完成,具体来说就是 Springboot. 大致罗列下要做的事情:介绍服务器远程连接方式进行基础的服务器安全配置禁

2020-10-03 11:02:23 1198

原创 加固了就安全了?几个措施让你的 Android 应用更安全

1、背景最近新开发了一款工具类型的软件 移动工具箱,然而某天下午忽然群里来了一个不速之客说我的软件被破解了。虽然,该软件无需付费并且没有广告(很良心 ???? ),也进行了安全加固,但是还是很轻易得被别人破解了。现象是,启动页换成了别人的页面,需要用户点击页面上的按钮分享几次破解者的信息才能进入应用。并且,每次打开应用都是如此。看到这我的心情还是非常复杂的。一开始觉得自己做个应用都赚不到钱,还要被这些人利用。本是同根生,相煎何太急呀。然而,转念一想,这里有些东西还是可以学习一下,于是我去他们的链接下载了

2020-09-30 13:13:44 630

原创 一个高性能、功能丰富、可自定义的 Android 相机库 iCamera 的设计和开发过程

1、背景介绍去年年初的时候写过一篇文章 《CameraX:Android 相机库开发实践》,那时我想自己写一个 Android 相机库,但是因为名字和谷歌关放的 CameraX 冲突了,所以现在我将自己的项目改名为 iCamera.之前的文章中也交代过一些 Android 相机库的背景,本身集成相机功能到自己的项目中并不复杂,但是如果设计一个功能全面的 Android 相机库就没那么简单了——你要满足更多用户的需求,基本的缩放、闪光灯等这些在日常开发中不会涉及的功能都要支持;此外,你还要处理相机的各种支

2020-08-31 23:22:56 1503

原创 跨平台、多用户协作的移动应用 (安卓+iOS) 多语言管理工具

1、项目背景TranslateMyApp 项目是我之前为了在 Android 应用中集成多语言而开发的一个工具,当时主要为了解决应用的词条的多语言翻译问题,然而实际应用的时候发现起存在诸多的不便之处。最近当我开发 言叶APP 的时候,为了减少多语言维护的工作量,重新开发了这个应用。现在它具备了更多功能和特性,可以满足更多的应用场景。该项目基于 Python 开发,项目地址:https://github.com/Shouheng88/TranslateMyApphttps://gitee.com/Wn

2020-08-30 19:58:30 864

原创 用这个库解决你的图片压缩和加载问题

在 Android 应用中,图片是占用内存资源比较多的一部分。如何在应用当中加载并处理图片的同时又能够保证程序响应的效率呢?你可以使用我开发的这个库:Compressor。随着新版本 1.3.5 的发布,这个库已经支持了非常多的功能,并且支持在 Kotlin 协程中获取压缩的结果。之所以添加这些功能是因为在之前我做的应用都是与 CV 相关的,所以不可避免地要面对林林种种的应用场景。能够支持更多的应用场景,这也是这个库与其他的很多框架不同的地方。下面就通过示例一一介绍下如何使用该库处理各种应用场景。1、

2020-06-06 21:18:53 421

原创 2020 年,我这样在项目中使用 MVVM

最近看到了几篇与 Jetpack MVVM 有关到文章,使我不禁也想淌一下这场混水。我是在 2017 年下半年接触的 Jetpack 的那套开发工具,并且后来一直将其作为开发的主要框架。在这段时间的使用过程中,我踩过一些坑,也积累了一些经验,为了将其推广到其它到项目中又专门封装出了一个库。当然,Jetpack 所提供的组件已经比较完善,我的工作只能算是锦上添花。下面我就介绍下,现在我是如何在项目中使用 Jetpack MVVM 的。1、后起之秀和黯然失色的 MVPMVP 非常强大,也是或者曾经是很多大公

2020-05-23 11:46:56 703

原创 一个少见的线上 Crash 分析:Caused by: java.lang.IllegalStateException: View DecorView@2918947[RoomManageActivi

Take the Dialog for example.Judge from the Android source code, let’s watch what happened when you called method Dialog#show() method. The code can be simplified as below: public void show() { ...

2020-01-10 15:08:51 784

原创 Android 与计算机视觉

不管你是否从事计算机视觉相关的工作,了解这方面的内容总是好的,因为即使你现在的工作与 AI 无关,采用一些开放的 API 仍然有可能让你的应用做得更好。比如,百度开发平台就提供了许多 AI 相关的 API,像当下比较受欢迎的“白描”等应用,其实就是使用了百度的 API。所以,你也可以考虑一下能否借助一些语音和文字识别等功能来赋能自己的应用。因为我们所做的计算机视觉的东西更多的是对图片进行处理,这...

2019-07-18 18:59:29 649

原创 Android Studio Gradle Already disposed Module

记录一个让人崩溃的问题:Android Studio Gradle Already disposed Module。因为最近从 Windows 换到了 Mac,之前在 Gradle 里面调整项目依赖关系,屡试不爽,最多也就是把 IDEA 自动生成的东西删掉。但是换了 Mac 之后这招看上去有些失灵了。无语,比如调整了依赖之后,AS 把移除的模块显示出来,引用的模块就是不显示。移除了所有的 .xml...

2019-06-30 21:58:51 1519

原创 Git 学习笔记

1 版本控制1.1 提交文件在一个新的文件夹下可以使用 git init 将一个文件添加到 Git 中进行管理。然后,可以使用 git add file_1 [file_2] ... 指令将文件添加到 Git 仓库中。添加了文件之后就可以提交文件了,这使用 git commit -m "提交内容备注" 指令。如果需要查看 Git 当前到状态,则可以使用 git status 指令。这个指...

2019-06-10 22:25:13 247

原创 整合 Spring 开发框架及服务端技术

1、关于项目1.1 项目的内容介绍Spring-reference 项目为 Spring 整合 MyBatis + Spring MVC,以及 Java Web 方向上多种常用的技术的演练,作为参考和交流学习的资料。另外,也是为了更好地掌握 Spring Boot 打下基础。该项目注释完备,代码规范,只做技术演练,没有过多复杂的业务逻辑,适合作为新手学习的参考。项目地址:Shouheng88/...

2019-06-08 23:38:11 438

原创 一款现代、高效的 Android 图片压缩框架

本项目主要基于 Android 自带的图片压缩 API 进行实现,提供了开源压缩方案 Luban 和 Compressor 的实现,解决了单一 Fie 类型数据源的问题,并在它们的基础之上进行了功能上的拓展。该项目的主要目的在于:提供一个统一图片压缩框库的实现,集成常用的两种图片压缩算法,让你以更低的成本集成图片压缩功能到自己的项目中。1、项目背景:开源的图片压缩库现在 Github 上的图片...

2019-05-18 17:21:02 3985 3

原创 CameraX:Android 相机库开发实践

前言前段时间因为工作的需要对项目中的相机模块进行了优化,我们项目中的相机模块是基于开源库 CameraView 进行开发的。那次优化主要包括两个方面,一个是相机的启动速度,另一个是相机的拍摄的清晰度的问题。因为时间仓促,那次只是在原来的代码的基础之上进行的优化,然而那份代码本身存在一些问题,导致相机的启动速度无法进一步提升。所以,我准备自己开发一款功能完善,并且可拓展的相机库,于是 Camera...

2019-04-23 23:26:47 5463 5

原创 C++ 复习笔记

1、类的成员1.1 定义一个类定义一个类的时候,可以将类的定义和实现分别定义在各自的文件中。类的定义使用头文件的形式,通俗来说,即 .h 类型的文件。类的实现使用 .cpp 类型的文件。如果需要给定义的类指定一个命名空间,那么我们可以直接在头文件中指定。同一个命名空间的代码块可以定义多个类,也可以定义结构体。#pragma once#include <opencv2/opencv.h...

2019-04-18 19:37:39 337

原创 理解 Servlet 和 JSP

理解 Servlet 和 JSP最初接触 Java 的时候用它来做一些桌面程序,所以对 Java Web 方向没有深入研究过。后来接触了 SSM 和 Spring Boot 等框架之后渐渐转向了 Web 方向。不过,对于 Servlet 和 JSP,虽然经常在招聘信息和别人推荐的 Java 学习路线上面看到,对它们的理解一直处于模糊的状态。最近,专门找了相关的资料进行学习,花了两三个小时就大致看...

2019-03-30 11:44:44 326

原创 对 Spring 事务管理机制及其配置方式的总结

Spring 事务管理有一部分内容与数据库的事务管理机制相关。关于数据库事务管理机制可以参考数据库相关内容,比如 MySQL 的建议参考《高性能 MySQL》等书籍。这里我们重点介绍 Spring 中事务的配置和使用的方式。1、数据库事务相关梳理下基本的知识点:事务的 ACID 特性:原子性、隔离性、一致性和持久性。事务的四种隔离级别:未提交读、提交读、可重复读和序列化。数据...

2019-03-25 00:10:55 226

原创 对 Spring AOP 机制及其配置方式的的总结

1、基本概念梳理1.1 基本概念连接点 (Jointpoint):表示需要在程序中插入横切关注点的扩展点,连接点可能是类初始化、方法执行、方法调用、字段调用或处理异常等等;切入点 (Pointcut):选择一组相关连接点的模式,即可以认为连接点的集合;通知 (Advice):在连接点上执行的行为,包括前置通知、后置通知、环绕通知,在 Spring 中通过代理模式实现 AOP;方面/切面...

2019-03-24 19:53:50 220

原创 对 Spring IOC 机制及其配置方式的的总结

1、Spring Ioc 的基本原理:BeanFactorySpring Ioc 容器的代表就是 BeanFactory 接口,它其中定义了一些获取 Bean 的方法 getBean()。ApplicationContext 接口扩展了 BeanFactory,还提供了与 Spring AOP 集成、国际化处理、事件传播及提供不同层次的 context 实现。我们可以从 BeanFactory ...

2019-03-24 17:31:21 486

原创 常用的 CMake 指令总结

CMamke 的官方文档:https://cmake.org/cmake/help/v3.0/manual/cmake-commands.7.html1. cmake_minimum_required设置 CMake 项目要求的最低的版本:cmake_minimum_required(VERSION major[.minor[.patch[.tweak]]] ...

2019-03-18 15:23:57 534

原创 开源一个 Android 图片压缩框架

在我们的业务场景中,需要使用客户端采集图片,上传服务器,然后对图片信息进行识别。为了提升程序的性能,我们需要保证图片上传服务器的速度的同时,保证用于识别图片的质量。整个优化包括两个方面的内容:相机拍照的优化:包括相机参数的选择、预览、启动速度和照片质量等;图片压缩的优化:基于拍摄的图片和从相册中选择的图片进行压缩,控制图片大小和尺寸。在本文中,我们主要介绍图片压缩优化,后续我们会介绍如何...

2019-03-12 23:40:27 1237

原创 com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Could not create connection...

已经不只一次遇到这个问题了,因为我的 MySQL 使用的版本是高于 8 的,从 Github 上面下载的开源项目都是基于 8 之前的,所以当使用数据库连接池建立连接的时候会连接失败并抛出上面异常。问题的原因是项目中使用的数据库连接驱动的版本太低,所以解决的办法是提高 MySQL 数据库连接驱动的版本:原来的数据库连接驱动 &lt;dependency&gt; &lt;g...

2019-03-09 12:47:46 3260

原创 Android 插件化框架 DynamicLoadApk 源码分析

DynamicLoadApk 应该算是 Android 插件化诸多框架中资历比较老的一个了。它的项目地址在:dynamic-load-apk。该项目运行之后的效果是,使用 Gradle 编译出插件包和宿主包,都是以 APK 的形式。安装宿主包之后,通过 ADB 将插件包 push 到手机中。启动宿主包时,它会自动进行扫描将插件加载到应用中。点击插件之后,进入到插件的应用界面。印象中最初接触的插件...

2019-03-02 13:44:08 306

原创 在 Android 中使用 JNI 的总结

最近在研究 Android 相机相关的东西,因为想要对相机做一个封装,于是想到要提供支持滤镜和图像动态识别相关的接口。在我找到一些资料中,它们的实现:一个是基于 OpenGL 的,一个是基于 OpenCV 的。两者都可以直接使用 Java 进行开发,受制于 Java 语言的限制,所以当对程序的性能要求很高的时候,Java 就有些心有余力不足了。所以,有些实现 OpenCV 的方式是在 Native...

2019-03-02 11:51:05 453

原创 Android 高级面试-5:四大组件、系统源码等

1、四大组件1.1 ActivityQ:在两个 Activity 之间传递对象还需要注意什么呢?对象的大小。Intent 中的 Bundle 是使用 Binder 机制进行数据传送的。能使用的 Binder 的缓冲区是有大小限制的(有些手机是 2 M),而一个进程默认有 16 个 Binder 线程,所以一个线程能占用的缓冲区就更小了(有人以前做过测试,大约一个线程可以占用 128 KB...

2019-02-26 23:35:20 554

原创 数据结构与算法回顾-4:平衡查找树

二叉树虽然能解决查找的问题,但是在某些情况下,比如当任意相邻的两个元素之间是按照升序或者降序插入的话,那么得到的树将是一个链表的形状。当然这只是一种极端的情况,只是用来说明,树的形状对二叉查找的效率有很大的影响。这里的平衡二叉树能够让树保持完美的平衡,不会出现极端的成为链表等,而且我们也会试图去保持树的完美平衡。它实现这个平衡目的的方式是:对于 3-结点,如果再向其插入数据,就会使其变成 4-...

2019-02-26 00:23:23 263

原创 数据结构与算法回顾-3:二叉查找树

1、概念二叉查找树(BST) 是一种二叉树,它的每个结点都只有左右两个链接,分别指向自己的左子结点和右子结点,并且每个结点都大于其左子树中的任意结点的键,并且小于任意右子树的任意结点的键。(注意和堆的区别)2、代码实现2.1 使用循环的方式来进行查找和插入下面的代码中使用了循环的方式来将指定的键值对插入到表中。缺点:相比于使用递归的方式这里的代码显得比较冗长,而且在循环之中没办法统计和更新...

2019-02-26 00:06:26 211

原创 数据结构与算法回顾-2:排序算法小结

在下面的排序算法中会使用到的方法: protected static void exchange(Comparable[] arr, int fromPos, int toPos) { Comparable temp = arr[fromPos]; arr[fromPos] = arr[toPos]; arr[toPos] = temp; ...

2019-02-25 23:48:49 226

原创 数据结构与算法回顾-1:算法的度量和基本数据结构

1、数据结构数据结构是相互之间存在一种或多种关系的数据的集合。1.1 三要素数据结构三要素是:1.数据的逻辑结构;2.数据的物理结构;3.数据的运算。数据结构是相互之间存在一种或多种特定关系的数据元素的集合。1.1.1 逻辑结构分为线性结构和非线性结构,线性结构:线性表、栈、队列非线性结构:树、图、集合1.1.2 存储结构即物理结构,分四种(存储数据时不只要存储元素的值...

2019-02-25 23:33:04 248

原创 Androd 应用启动过程的源码分析

在之前的文中,我们已经了解过了 Android 系统启动的过程。系统启动之后会由 PMS 安装系统应用,并启动 Launcher,也就是桌面程序。然后,我们安装的程序的图标将会显示到桌面上面。所谓应用启动过程分成两种情形,一个是应用进程已经建立,一种是应用进程没有建立的情况下。后者需要先创建应用进程,然后再执行启动的过程。安卓系统中的应用在源码中的位置是 platform/packages/a...

2019-02-24 18:06:49 234

空空如也

空空如也

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

TA关注的人

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