自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

川峰的博客

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

  • 博客(123)
  • 资源 (4)
  • 论坛 (1)
  • 收藏
  • 关注

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

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

2021-01-22 19:44:15 7

原创 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 37

原创 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 28

原创 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 25

原创 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 44

原创 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 40

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

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

2020-12-23 21:39:25 25

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

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

2020-12-21 22:10:03 19

原创 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 120

原创 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 26

原创 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 25

原创 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 58 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 40

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

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

2020-09-18 22:11:18 593

原创 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 551

原创 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 18089 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 476

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

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

2020-01-30 22:01:40 229

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

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

2019-07-04 21:47:42 188

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

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

2019-06-28 19:25:09 221

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

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

2019-06-27 20:43:40 1463

原创 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 469

原创 Android Studio tools:replace的使用

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

2019-06-27 19:29:52 5353

原创 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 2172

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

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

2019-06-27 00:11:31 14663 8

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

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

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

转载 EventBus源码学习

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

2019-06-11 19:39:36 80

原创 EventBus使用详解

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

2019-06-03 20:41:17 2549

原创 RxJava背压

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

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

原创 RxJava操作符

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

2019-05-15 08:50:46 2006

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

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

2019-05-07 20:39:07 828

转载 解决Android Studio无法查看API 27的源码

解决方法Step1.下载源码通过 SDK Manager 可以查看和下载源码包。Android Studio 会根据 compileSdkVersion 的值去加载对应版本的源码包。所以,源码包选择下载的版本和编译版本 保持一致。imageStep2.关联源码找到 jdk.table.xml,找到源码相应版本的 < sourcePath>标签,把源码路径写进...

2019-05-06 18:35:46 591

原创 Espresso测试框架的使用

Espresso是Google官方提供的一个Android测试库,是一个AndroidJunit测试库,需要运行到设备或模拟器上进行测试。Espresso是意大利语“咖啡”的意思,它的最大的优势是可以实现UI自动化测试,设计意图是想实现喝咖啡的功夫就完成自动测试。通常我们需要手动点击测试的UI功能,利用这个库可以自动为你实现。添加依赖:dependencies { androidTes...

2019-05-06 17:29:15 3338 9

原创 Android单元测试框架Robolectric的学习使用

Robolectric普通的AndroidJunit测试需要跑到设备或模拟器上去,需要打包apk运行,而Robolectric通过实现一套能运行的Android代码的JVM,然后在unit test运行的时候去截取android相关的代码调用,然后转到自己实现的代码去执行这个调用的过程。从而达到能够脱离Android环境运行Android测试代码的目的。最新的Robolectric是4.3+...

2019-04-29 16:34:02 3344

原创 Android单元测试学习总结

Android单元测试主要分为以下两种本地单元测试(Junit Test), 本地单元测试是纯java代码的测试,只运行在本地电脑的JVM环境上,不依赖于Android框架的任何api, 因此执行速度快,效率较高,但是无法测试Android相关的代码。Android单元测试(Android Test),是针对Android相关代码的测试,需要运行在真机设备或模拟器上,运行速度较慢,但是可以...

2019-04-22 08:53:22 2748 2

原创 Okio源码学习分析

在之前的文章Okio—— 更加高效易用的IO库中参考官方的demo简单学习了一下Okio的使用方法,这篇就来简要分析学习一下Okio的源码实现。Okio源码中主要有这么几个重要的东西:Source和SinkSegmentBufferByteStringTimeout下面依次来看一下这几个东东:Source & Sink这两个是Okio中最基本的两个接口,分别对应jav...

2019-04-18 10:31:16 509

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

在OkHttp的源码中经常能看到Okio的身影,所以单独拿出来分析一下,作为作为OkHttp的低层IO库,Okio确实比传统的java输入输出流读写更加方便高效。

2019-04-08 20:09:02 9269 3

转载 Android android:launchMode=“singleInstance” 页面跳转黑屏

将Activity的启动模式设置为singleInstance,即android:launchMode=“singleInstance”当应用跳转到启动模式设置为singleInstance的Activity页面时,出现一段黑屏修改方式如下步骤一、在AndroidManifest.xml中设置Activity主题 android:theme="@style/Theme.TitleBar"&...

2019-04-03 15:16:08 666

原创 Android锁屏下弹窗的尝试

首先,可以确定的一点是锁屏下弹出页面必须用Activity实现,用WindowManager和Dialog均不行,然后有个注意的地方就是某些手机默认是不允许应用在锁屏下弹出界面的,比如小米的MIUI和魅族的Flyme, 需要在设置中打开一项权限才可以:并且这个权限不能像其他权限一样可以在代码中动态申请,只能用户手动选择允许。在我的手机上这个权限默认是禁止的,即便选择询问,有时也是不能弹出询问...

2019-03-25 21:27:56 2073 4

原创 华为全面屏适配踩坑记录

华为手机什么都好,就是底部有个恶心的虚拟导航栏,对开发者而言为了去掉这个导航栏真是操透了心,这里主要记录全屏状态下对虚拟导航栏的隐藏做的尝试。首先,Activity全屏设置: @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInst...

2019-03-20 12:58:13 3490

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关注的人 TA的粉丝

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