自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

川峰的博客

知我者谓我心忧,不知我者谓我何求

  • 博客(130)
  • 资源 (4)
  • 收藏
  • 关注

原创 升级最新版本Android Studio Arctic Fox 遇到的问题

首先 Android Studio 从4.2以后,也就是4.3开始,版本名字改了不采用以前的命名方式了,去官网下载最新版本就会知道了。Arctic Fox 翻译成中文是叫白狐或北极狐,Google越来越会玩了,甜品玩腻了,开始使用动物来命名了。。然后,如果你升级了最新版本之后,会出现一些引起生理不适的问题。。所以升级要慎重,尽量先用4.0到4.2的稳定版本,这里主要记录一下使用最新版本遇到的几个问题。1. Gradle版本与Gradle插件版本gradle版本最低为 7.0.2,gradle插件版

2021-08-09 12:49:38 6491 9

原创 Android 10 申请动态权限以后仍然无法读写文件的解决方案

如果 targetSdkVersion = 29, 即便是在判断申请读写动态权限成功以后,也无法对外置卡路径(ExternalStorage)进行读写,可以使用以下代码进行测试 String path = Environment.getExternalStorageDirectory().getPath() + "/Download"; File file = new File(path); if (file.exists()) { if (file.canRead()) {

2021-07-20 11:35:47 1896 1

原创 Android中的线程(二)线程安全 & 线程同步

文章目录线程安全synchronizedReentrantLockvolatile线程安全线程安全又叫线程同步,在Java中多个线程同时访问一个可共享的资源变量时,有可能会导致数据不准确,导致使用该变量的逻辑出现问题,因此使用同步锁来保证一个线程对该资源的操作完成之前,其他线程不会对其进行操作,即保证线程同步安全。因此线程同步的本质就是线程排队,这可能跟它的字面意思相反,它的目的就是保证线程按照先后顺序一个一个的访问共享资源,为了避免同时操作同一个共享资源。在Java中实现线程安全的主要手段有:

2021-06-08 23:20:38 1121 4

原创 Android中的线程(一)

文章目录new ThreadAsyncTaskHandlerThreadIntentServiceJobIntentServicenew Thread缺乏统一管理,无限制创建,可能占用过多系统资源导致死机或oom,不推荐。AsyncTask场景:需要知晓任务执行的进度,多个任务串行执行缺点:生命周期和宿主的生命周期不同步,有可能发生内存泄漏,默认情况所有任务串行执行class MyAsyncTask extends AsyncTask<String, String, String>.

2021-06-08 23:18:59 1733 10

原创 Android 12 行为变更:适配以Android 12为目标的应用

Android 12目前还是开发者预览版,预计到8月份会出正式版,但是官网已经给出了关于以Android 12为目标的应用适配应该注意的事项。包含 intent 过滤器的应用组件必须声明 exported 属性以 Android 12 为目标平台的应用,且包含使用 intent 过滤器的 activity、服务或广播接收器,必须为这些应用组件显式声明 android:exported 属性。如果 activity、服务或广播接收器使用 intent 过滤器,并且未显式声明 android:export

2021-05-24 22:12:29 4285 2

原创 Sass基础入门

目前公司多端项目开发中使用的 js/css文件结构如下:如果你也是第一次接触这种,你会好奇的发现,它的CSS的文件命名方式有点特殊,跟传统的.css文件不同,要想搞清楚这样命名,主要了解两个东西,一个是 CSS Modules, 通过该链接我们了解到 CSS Modules 就是以模块化的方式来管理 CSS,它可以避免 CSS 样式全局污染的问题,因为使用CSS Module编译后的class类名会变成一个唯一的字符串, 它是采用 css-loader 默认的哈希算法[hash:base64]来生成

2021-04-25 16:03:30 179

原创 Android 实现全局浮动弹窗

全局浮动小窗口,类似于微信的语音通话全局小窗口,还有一些手机的桌面的全局操作按钮等,算是比较常用,简单记录一下。实现原理:在Application中,getSystemService(Context.WINDOW_SERVICE) 获取WindowManager,然后通过WindowManager添加View, 手势滑动时实时更新该window的LayoutParams的x | y 坐标。核心代码:Application中创建window:public class App extends Appl

2021-04-23 16:34:39 1554 2

原创 Android Lifecycle生命周期组件探索

最近了解到一个开源库,uber的 AutoDispose,由于不经常使用RxJava,竟然不知道还有这么个东西。。它的主要作用就是在Activity或View销毁不可用的时候自动取消RxJava的订阅,也就是常用的Disposable切断管道流, 取消订阅,避免内存泄漏。AutoDispose将之前的Disposable.dispose()操作做了封装,可以自动处理。它的使用就不去详细探索了,搜索一下就有一堆,这里主要探究一下AutoDispose的实现原理的关键技术点,既然它能在AC销毁的时候自动取消,

2021-04-14 23:37:03 969 2

原创 Kotlin学习手记——协程进阶

作用域:顶级:coroutineScope表示协同作用域,coroutineScope内部的协程出现异常可以挂掉外部协程,会向外部传播,外部协程挂掉也会挂掉子协程,即双向传播。supervisorScope表示主从作用域,supervisorScope内部的协程挂掉不会影响外部的协程继续运行,它就像一道防火墙,隔离了异常,保证程序健壮,但是如果外部协程挂掉还是可以取消子协程的,即单向传播。简单总结就是,主从关系:无法坑爹,爹可以坑儿子。协同关系:可以坑爹,可以坑儿子,互相坑。

2021-02-02 20:17:29 288

原创 Kotlin学习手记——协程初步

乍一看很懵逼,其实简单的说,协程就是可以控制线程切换的代码,或能实现类似的功能的,可以让异步代码同步化,如JS里的async和await等。 这种方式可以给我们简化代码,使得业务逻辑清晰。最常见于网络请求的回调,如一般我们会有一个成功的回调和一个失败的回调,按照异步的写法,两个回调方法中都要处理逻辑,协程可以使异步回调按照同步的方式去返回结果,写法简单,清晰。kotlin通过suspend关键字来指定函数可以挂起,实现异步转同步的功能。异步程序最麻烦的就是,当你有多个异步程序同时运行时,比.

2021-01-22 19:44:15 245

原创 Kotlin学习手记——注解、注解处理器、编译器插件

注解定义:@Retention(AnnotationRetention.RUNTIME)@Target(AnnotationTarget.CLASS)annotation class Api(val url: String)@Target(AnnotationTarget.VALUE_PARAMETER)annotation class Path(val name: String = "")@Target(AnnotationTarget.FUNCTION)annotation class

2021-01-14 14:38:45 482

原创 Kotlin学习手记——反射

基本上和java是一一对应的,其中KType表示的是未擦除的泛型,KClass获取的是实际运行时的类型,不带泛型参数的。Kotlin使用反射的话,唯一一点不好的就是需要引入一个体积非常大的库:dependencies { // kotlin反射库,大小2.5M左右 implementation "org.jetbrains.kotlin:kotlin-reflect:1.4.20"}没错,有2.5M,不过编译后的大小还能接受kotlin获取KClass通过两个冒号var...

2021-01-11 20:32:30 711 1

原创 Kotlin学习手记--泛型、泛型约束、泛型型变、星投影、泛型擦除、内联特化

泛型约束:fun <T : Comparable<T>> maxOf(a: T, b: T): T { return if (a > b) a else b}fun main() { val max = maxOf("Hello", "World") println(max) //输出World}多个泛型参数,可以每个泛型都有约束:fun <T, R> callMax(a: T, b: T): R ...

2021-01-04 21:07:19 189

原创 Kotlin学习手记——Json解析

Kotlin中解析Json有那么几种方式:GsonMoshikotlinx.serialization其中Gson是原来经常使用的Google的解析库,用这个在kotlin中使用已经不适合,会有很多情况不支持,如空类型 默认值等。然后就是moshi,这个是square出品的,还有就是Kotlin自带的kotlinx.serialization,不过kotlin自带的居然不支持java类。显然对于android开发者来说,如果你使用kotlin一般都是java和kotlin混合使用的,所以首选的还

2020-12-24 23:18:52 2126

原创 Kotlin学习手记——单例、内部类、数据类、枚举类、密封类、内联类

Kotlin单例:只需要类前面添加object关键字即可,object定义类等价于java的恶汉式的单例模式object Singleton { var x: Int = 2 fun y(){ } init { //object不能定义构造函数,但可以定义init块 }}object不能定义构造函数,但可以定义init块使用:fun main() { Singleton.x Singleton.y()}@JvmStati

2020-12-24 20:54:43 190

原创 Kotlin学习手记——构造器、init块、工厂函数、可见性、延迟初始化、代理

构造器内省写var的属性,可以防止类内初始化,类似java中的大括号初始化,该初始化会跟构造函数一起执行。init块中可以直接访问到构造方法中的参数。init块可以有多个,可以分开写,init块最终会合并执行。副构造函数,后面可以指定调用主构造函数或其他副构造函数,类似java的构造函数重载,但是kotlin不推荐定义很多副构造函数(会增加复杂度),还是推荐定义一个主构造器。构造同名的工厂函数,函数名也可以与类的名字不同,工厂方法比构造函数更具有表现力,因为它可以通过名字知道类是...

2020-12-23 21:39:25 260

转载 Kotlin中的几个特殊符号 ( ‘?.‘ ‘?:‘ ‘!!‘ ‘as?‘ ‘?‘ )

?.安全调用符if (foo != null){ return foo.bar()}else{ return null}?:as?!!?

2020-12-21 22:10:03 271

原创 Kotlin学习手记——集合变换、序列、聚合、SAM转换、DSL

val list = listOf(1, 2, 3, 4)list.filter { it % 2 == 0 }list.flatMap { 0 until it } .joinToString().let(::println)list.asSequence() .flatMap { (0 until it).asSequence() } .joinToString().let(::println) val newL...

2020-12-18 00:04:12 316

原创 Kotlin学习手记——表达式、运算符重载、lambda表达式、中缀表达式、高阶函数、内联函数

表达式在kotlin里面分支判断都是表达式而不是语句,在java中是语句,这个是kotlin与java的最大不同 var c: Int if (a == 3) { c = 4 } else { c = 5 } //可以直接表达式赋值 c = if (a == 3) 4 else 5由于是表达式,所以分支判断都可以直接赋值为一个变量,c = if (a == 3) 4 else 5,因此kotlin里面没有三目运算符,是

2020-12-14 22:25:37 115

原创 Kotin学习手记——类、接口、扩展方法、空类型

定义类和构造方法:class SimpleClass(var x: Int, val y: String){}//创建类不需要new关键字val simpleClass = SimpleClass(9, "Hello")构造方法放在类名的后面,如果x和y前面加了var或val, x和y会分别在类中定义一个属性以及对应的getter和setter方法,不需要额外写,否则必须手动写getter和setter实现。类前面不需要修饰符public private等,跟java不一样,默认是publi.

2020-12-11 23:17:23 144

原创 Kotlin学习手记——基本类型、变量、集合、数组、区间、函数声明

val—声明只读变量var—声明可读写变量kotlin基本数据类型:变量声明: var a: Int = 2 val b: String = "Hello Kotlin"特点是冒号后面跟上类型变量声明—类型自动推导: var a = 2 val b = "Hello Kotlin"这种方式可以省略类型,由kotlin自动推导长整型写法,必须以大写 L 结尾,与java不同:// val c = 12345678910l // compile er.

2020-12-11 21:10:20 220 1

原创 Kotlin学习手记--环境配置

Kotlin官网: https://kotlinlang.org/使用kotlin有三种方式:命令行编译需要安装command-line:https://kotlinlang.org/docs/tutorials/command-line.html可以直接到Github上面下载最新的zip包解压使用:https://github.com/JetBrains/kotlin/releases/tag/v1.4.20 (下载很慢)命令行编译方式,定位到bin目录,类似java命令行编译方式:编译:

2020-12-10 23:52:51 229

原创 Flutter学习笔记&学习资料推荐

对Flutter的学习已经有一段时间了,这里做一下总结记录吧,可能主要是学习资料的总结,还有一些杂七杂八的学习笔记。 Flutter 初体验 先说说对Flutter的感受吧,总的来说上手还是比较容易的,因为他的思想理念跟React十分相似,都是通过状态管理控制UI界面的更新,甚至连setState的方法名都是一样的,如果你是学习过类似React的框架的话,将很容易理解,基本可以直接开撸。但是它有好的地方,也有不好的地方。 好的地方:一个是它的reload热加载到手机,这样写代码调试的时候不用每次运行.

2020-09-18 22:11:18 2100 4

原创 Git忽略已经提交的文件

执行命令:git rm --cached .idea/gradle.xml,然后提交即可。如果报错,可尝试加上-f, git rm --cached -f .idea/gradle.xml注意,已经提交到Git服务器的文件,即便你更新了.gitignore文件,下次提交也是不会被忽略的,这个文件只针对尚未被提交的文件进行忽略起作用。详细参考:https://segmentfault.com/...

2020-02-25 18:57:17 788

原创 Android 10 出现"此应用专为旧版Android打造,因此可能无法正常运行。请尝试检查更新或与开发者联系"

在Android P(9.0)出现此弹窗,多数建议为`targetSdk > 17, minSdk> 17`, 最近测试反应在Android 10上也出现该弹窗,经测试targetSdk > 17时能够安装,但是会有弹窗提示,要去掉这个弹窗需要修改`targetSdk >= 23`即可, 但是修改23的话要记得加动态权限申请。出现此弹窗的关键代码是AppWarnings...

2020-02-24 17:48:25 26462 1

原创 Android常用adb命令

官方参考地址:https://developer.android.com/studio/command-line/adb.html?hl=zh-cn (可能需要翻墙,可以使用在线代理访问)基本命令:查看连接的设备 adb devices进入指定设备 adb -s serialNumber shell连接状态 adb get-state查看版本 adb version启动ADB服务 ad...

2020-02-24 12:46:29 784 1

原创 关于模块化的一些思考/记录

我这里所说的“模块化”可能是更加广义的理解概念,不限于具体的实现方式;通常模块化的目的是为了使得项目更加方便的管理,易于维护,这对于多人团队共同开发同一个项目或者项目业务体积日趋庞大的情况尤为重要。这里只是我对模块化的思考做一些随笔记录,并不是具体指导教程,如有想法欢迎交流。物理隔离所谓的物理隔离也就是代码文件的隔离,我认为这是实现模块化的第一首要任务,即保证你的代码文件相互分隔开来,一方面从...

2020-01-30 22:01:40 457

原创 Android MVP模式深入实践探索(二)

上一篇总结了MVP模式的基础结构,这一篇主要总结在MVP模式中该如何进行分类,即哪些属于View层,哪些该放在Presenter层,哪些该放在Modle层,如何从一堆杂乱的UI代码中将相关代码提取到MVP对应的层次当中。先从View层说起,对于View层其实是最好划分的,首先想到的是Activity、Fragment、Dialog等系统的组件,还有加载我们的布局文件,进行findView操作,对...

2019-07-04 21:47:42 247

原创 Android MVP模式深入实践探索(一)

其实MVP已经不算新东西了,写这篇文章的目的主要是为了把之前在项目重构中应用的MVP模式做一个整理、总结和记录,把实践代码做成一个可描述可理解的过程。一篇可能写不完,总共打算分几篇来记录,这将包括且不限于以下内容:MVP模式基础结构介绍MVP模式中如何分类,哪些属于View层,哪些该放在Presenter层,哪些该放在Modle层MVP模式中关于View层使用的数据类MVP模式中Vie...

2019-06-28 19:25:09 305

原创 Android Studio中资源文件夹的模块化配置

有时app中res下面的文件太多了想分一下类,如所有的布局文件都在layout文件夹下面,太多的话找起来不方便。一开始我想这个问题大概可以通过配置productFlavor来实现,但是productFlavor中不同的Flavor是互斥的,跟这个还不太一样的。下面是网上学来的分类分法,这里记录一下:第一种分法:gradle配置: sourceSets { main {...

2019-06-27 20:43:40 2039

原创 Android 7.0 AES加密报错:NoSuchProviderException: no such provider: Crypto

最近项目中遇到手机密码不能登录的问题,在别的地方看到了的解决方法,这里记录一下报错代码:调用SecureRandom.getInstance就会抛出异常:NoSuchProviderException: no such provider: Crypto,原来CryptoProvider在7.0以上不存在了解决代码:还要在项目中手动添加一个CryptoProvider类:public ...

2019-06-27 19:45:07 899

原创 Android Studio tools:replace的使用

一般是项目中使用的第三方依赖库中的AndroidManifest.xml中跟当前app的AndroidManifest.xml中有重复的某些属性时AS会提示这个,其实你按照他的提示添加就可以解决了,这里只是记录一下。如三方的依赖中application标签添加了android:theme, android:label可以在当前app中添加:<application and...

2019-06-27 19:29:52 13062

原创 Android Studio编译错误:Error while generating the main dex list

这个错误一般提示如下:FAILURE: Build failed with an exception.* What went wrong:Execution failed for task ':app:transformClassesWithMultidexlistForInstant_runDebug'.> com.android.build.api.transform.Tran...

2019-06-27 19:17:34 4045

原创 Android Studio使用Git提交、分支、切换、合并

首先到Git托管平台上创建一个空的项目,公司使用的Git托管平台是GitLab,所以先到GitLab上面创建一个项目:点击右上角的加号按钮,打开创建页面,输入项目名称、描述、选择项目的路径,点击create,会创建一个新的空项目出来, 在GitLab上面进入刚创建的项目查看,可以看到GitLab为我们列出了常用的Git命令:由于是首次创建项目是空的,所以我们本地先提交一个工程代码上去先找...

2019-06-27 00:11:31 28802 10

原创 一些提高Android开发效率的工具&方法

一些提高开发效率的工具&方法1. 使用快捷键提高操作效率下面的有些快捷键是经过我修改的,如果你不知道AS原生的快捷键是什么或者忘记了快捷键可以到Settings->Keymap下面搜索查看,使用熟练了之后就会记住了。当然你也可以在Settings->Keymap中修改自己觉得顺手的快捷键组合。快捷键作用对应菜单路径Ctrl + F当前文件查找内容...

2019-06-20 18:25:00 2605 2

转载 EventBus源码学习

在进入主题之前,我们先保持着这样几个疑问,EventBus的使用三要素里,我们为什么要去定义事件方法,并且用到了@subscribe()注解? EventBus.getDefault().register(Object)这行代码到底干了什么?发送事件的时候又做了哪些操作?为什么要在onDestory()做解除绑定的操作…等等(一) 注册: EventBus.getDefault().regist...

2019-06-11 19:39:36 110

原创 EventBus使用详解

EventBus是一个基于发布者/订阅者模式的事件总线框架。发布者/订阅者模式,也就是观察者模式(定义了对象之间的一种一对多的依赖关系,当一个对象状态发生改变时,它的所有依赖者都会收到通知并自动更新)。在EventBus中,当发布者发布事件时,所有订阅该事件的事件处理方法将被调用。EventBus的优点:解耦和简化Activities, Fragments等组件以及后台线程之间的通信,分...

2019-06-03 20:41:17 9913

原创 RxJava背压

RxJava背压主要用来解决异步订阅关系中,被观察者发送事件的速度与观察者接收事件的速度不匹配的问题。大多数情况下,由于被观察者发送事件速度太快,而观察者来不及响应处理所有事件,从而导致事件丢失、OOM等异常。RxJava 2.0中对背压的支持主要是通过Flowable类来实现的,Flowable其实就是被观察者(Observable)的一种新实现,用来解决RxJava 1.0中无法解决的背压...

2019-05-29 08:55:36 1019 1

原创 RxJava操作符

文章目录RxJava创建型操作符create()操作符just()操作符fromArray()操作符fromIterable()操作符differ()操作符timer()操作符interval()操作符intervalRange()操作符range()操作符rangeLong()操作符其他RxJava变换操作符map()操作符flatMap()操作符concatMap()操作符buffer()操作...

2019-05-15 08:50:46 2529

转载 Android应用被后台杀死后如何重新走闪屏逻辑

Android应用运行在后台的时候,经常被系统的LowMemoryKiller杀掉,当用户再次点击icon或者从最近的任务列表启动的时候,进程会被重建,并且恢复被杀之前的现场。什么意思呢?假如APP在被杀之前的Activity堆栈是这样的,A<B<C,C位于最上层APP被后台杀死后,APP端进程被销毁了,也就不存在什么Activity了,也就没有什么Activity堆栈,...

2019-05-07 20:39:07 1330

Android做的视频播放器MediaPlayer

基于Android的视频播放器,之前传的有错误,又修改了一下,界面不好,但功能都实现了,具有开始、暂停、重播、上一个、下一个等功能,但进度条和时间显示,可以调音量大小以及设置静音,具有从SD卡中选择视频文件的功能,也可以自动搜索SD卡中的视频文,可以添加视频到播放列表等等,当然也参考了一些其他的代码与资料,希望对学习Android的同志们有些帮助,我用的是Andorid2.2版本测试的

2012-08-12

MediaPlayer

自己实现的基于Android的视频播放器,具有开始、暂停、重播、上一个、下一个等功能,但进度条和时间显示,可以调音量大小以及设置静音,具有从SD卡中选择视频文件的功能,也可以自动搜索SD卡中的视频文,可以添加视频到播放列表等等,当然也参考了一些其他的代码与资料,希望对学习Android的同志们有些帮助

2012-07-31

电脑知识精华

电脑知识精华,全面的介绍了电脑故障及维护知识

2012-03-21

数据库原理实验报告资料

数据库上机实验,如何建立索引,如何检索等

2011-07-19

空空如也

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

TA关注的人

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