自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

王温暖的博客

这货太懒了

  • 博客(656)
  • 资源 (6)
  • 收藏
  • 关注

原创 面试:Java中的泛型会被类型擦除,那为什么在运行期仍然可以使用反射获取到具体的泛型类型

要想理解这个问题,首先应该对java虚拟机class文件有一定的理解,然后对这个问题的理解就会非常清晰。众所周知,java是在Java5的时候引入的泛型,为了支持泛型,JVM的class文件也做了相应的修改,其中最重要的就是新增了属性表,java编译为字节码后,其申明侧泛型信息都存储在Signature中,通过反射获取的泛型信息都来源于这里。而Signature属性表可以被class文件,字段表,方法表携带,这就使得:类声明,字段声明,方法声明中的泛型信息得以保留。例如上面代码中。

2021-03-23 20:35:56 3473 5

原创 为啥HashMap 桶中超过 8 个才转为红黑树

JDK 1.8 的 HashMap 和 ConcurrentHashMap 都有这样一个特点:最开始的 Map 是空的,因为里面没有任何元素,往里放元素时会计算 hash 值,计算之后,第 1 个 value 会首先占用一个桶(也称为槽点)位置,后续如果经过计算发现需要落到同一个桶中,那么便会使用链表的形式往后延长,俗称“拉链法”当链表长度大于或等于阈值(默认为 8)的时候,如果同时还满足容量大于或等于 MIN_TREEIFY_CAPACITY(默认为 64)的要求,就会把链表转换为红黑树。同样,后续如

2021-03-23 19:28:42 3148 1

原创 面试:IdleHandler相关

IdleHandler 说白了,就是 Handler 机制提供的一种,可以在 Looper 事件循环的过程中,当出现空闲的时候,允许我们执行任务的一种机制。IdleHandler 是 Handler 提供的一种在消息队列空闲时,执行任务的时机。但它执行的时机依赖消息队列的情况,那么如果 MessageQueue 一直有待执行的消息时,IdleHandler 就一直得不到执行,也就是它的执行时机是不可控的,不适合执行一些对时机要求比较高的任务。Q:IdleHandler 主要是在 MessageQue

2021-03-23 17:43:56 461 1

原创 Android Stuido4.1 的R.java位置

在主工程的目录下\build\generated\not_namespaced_r_class_sources\debug\r\com\xxx包名\R.java

2021-03-23 17:13:30 433

原创 Android集合SparseArray、ArrayMap使用场景

避免了基本数据类型的装箱操作会定期通过gc函数来清理内存,内存利用率高数据量小的情况下,随机访问的效率更高ArrayMap使用更少的存储单元存储元素ArrayMap使用int类型的数组存储hash,使用Object类型数组存储k-v键值对,相较于HashMap使用Node存储节点,ArrayMap存储一个元素占用的内存更小。ArrayMap在扩容时容量变化更小HashMap在扩容的时候,通常会将容量扩大一倍,而ArrayMap在扩容的时候,如果元素个数超过8,最多扩大自己的1/2。

2021-03-23 16:10:33 1108

转载 Android measure、layout、draw耗时对比

内容RelativeLayout、LinearLayout、FrameLayout、ConstraintLayout这四种类型的measure、layout、draw耗时对比。java测试试图结构:测试方式使用一个结构很是深的试图结构,重复执行measure、layout、draw各1000次。计算耗时。web结果(单位:ms):总结能够看出,各类布局除了measure差异比较大外,layout和draw耗时差异不大。 RelativeLayout在measure这一步

2021-03-23 16:02:16 938

原创 AIDL相关

一、AIDL oneway 以及in、out、inout参数的理解https://blog.csdn.net/anlian523/article/details/98476033onewayoneway可以用来修饰在interface之前,这样会造成interface内所有的方法都隐式地带上oneway;oneway也可以修饰在interface里的各个方法之前。被oneway修饰了的方法不可以有返回值,也不可以有带out或inout的参数。用 oneway 修饰的 AIDL 接口方法,

2021-03-23 14:55:15 433

转载 Android进程间通信 深入浅出AIDL

文中示例代码均可在demo中找到1. AIDL概念Android 接口定义语言 (AIDL) 与您可能使用过的其他接口语言 (IDL) 类似.您可以利用它定义客户端与服务均认可的编程接口,以便二者使用进程间通信 (IPC) 进行相互通信.在 Android 中,一个进程通常无法访问另一个进程的内存.因此,为进行通信,进程需将其对象分解成可供操作系统理解的原语,并将其编组为可供您操作的对象.编写执行该编组操作的代码较为繁琐,因此 Android 会使用 AIDL 为您处理此问题.跨进程通信(I

2021-03-23 14:29:49 362

原创 ContentProvider相关

一、基本概念:1.ContentProvider为存储和获取数据提供了统一的接口;2.使用ContentProvider可以在不同的应用程序之间共享数据;3.Android为常见的一些数据提供了ContentProvider(包括音频、视频、图片和通讯录等等 )二、ContentProvider线程/进程安全https://blog.csdn.net/zhanglianyu00/article/details/78362960ContentProvider的意义在于向其他应用提供数.

2021-03-19 14:05:20 1309

原创 Android面试:启动activity显示的第一帧

我们有这样一个需求,当一个activity启动后的第一帧,也就是肉眼可见的第一帧后做一个更新界面updateText的操作,这里的第一帧有没有一个合理的时机,让我们认为activity界面可见了?onResume是否可以认为是第一帧可见?public class MainActivity extends AppCompatActivity { private static final int DEALY_TIME = 300 ; private ImageView imageView

2021-03-13 22:16:28 1097

原创 Android面试:Invalidate、RequestLayout

Invalidate/RequestLayout 使用场合结合requestLayout和invalidate与View三大流程关系,有如下图:总结一下:1、invalidate调用后只会触发Draw 过程。2、requestLayout 会触发Measure、Layout过程,如果尺寸发生改变,则会调用invalidate。3、当涉及View的尺寸、位置变化时使用requestLayout。4、当仅仅需要重绘时调用invalidate。5、如果不确定requestLayout 是

2021-03-13 20:32:49 4022

原创 Android面试:compileSdkVersion、targetSdkVersion、minSdkVersion作用与区别

作用Android Studio 新建一个工程后,build.gradle里会有compileSdkVerson、targetSdkVersion、minSdkVersion这几个字段,这些配置有啥意义呢?compileSdkVersion:和编译时有关。比如我们当前compileSdkVersion=28(Andorid 9.0),Android 10 新增了有关5G的api。我们的app想尽早使用5G相关的api,这时只需要将compileSdkVersion=29(Android.

2021-03-13 18:10:25 10679

转载 Android面试:事件传递、绘制流程

请详细叙述Android事件分发机制:主线传递只有三步:Activity->ViewGroup->ViewActivity和View只有两个方法控制事件传递:dispatchTouchEvent(),onTouchEvent ();ViewGroup有三个方法控制传递:dispatchTouchEvent(),onInterceptTouchEvent(),onTouchEvent ();接下来用一张图给大家叙述下具体是怎么一步一步分发的。总结:1.对于 dispatchT

2021-03-13 17:03:05 298

原创 Android面试:如何能保证随时随地都能拿到一个 Activity 的当前生命周期

方式一:使用生命周期回调1、Application中registerActivityLifecycleCallbacks注册Activity生命周期回调public class App extends MultiDexApplication { @Override public void onCreate() { super.onCreate(); registerActivityLifecycleCallbacks(new

2021-03-13 15:26:25 613

原创 Android面试:Activity 生命周期面试题

今天我们一起来看五道 Activity 生命周期的面试题,相信看完之后面试官再问到相关的问题,你就能胸有成竹了。A Activity 打开 B Activity 时都有哪些生命周期回调。这道题相信很多同学都有遇到过,简单 A.onPause -> B.onCrete -> B.onStart -> B.onResume -> A.onStop . Naive ! 这样回答只是及格,因为仅在 B Activity 的 launchMode 为 standard 或者 B Act

2021-03-13 15:08:34 1136

原创 Android的activity、window、view之间啥关系

什么是 Activity、View、Window?Activity 是四大组件之一,也是我们的界面载体,可以展示页面;而 View 实际上就是一个一个的视图,这些视图可以搭载在一个 Layout 文件上,通过 Activity 的 setContentView() 方法传递给 Activity;Window 是一个窗体,每个 Activity 对应一个 Window,通常我们在代码中用 getWindow() 来获取它。你是怎样理解它们三者之间的关系的?Activity 像一个工.

2021-03-13 14:47:10 921

原创 匿名内部类访问的局部变量要用final修饰原因

除了匿名内部类内部,方法和作用域内的内部类内部使用的外部变量也必须是 final 的。原因如下:内部类会自动拷贝外部变量的引用,为了避免:1. 外部方法修改引用,而导致内部类得到的引用值不一致 2.内部类修改引用,而导致外部方法的参数值在修改前和修改后不一致。于是就用 final 来让该引用不可改变。https://blog.csdn.net/tianjindong0804/article/details/81710268...

2021-02-07 15:55:15 819 1

原创 二进制和java对象的相互转换

序列化存储对象数据需要将数据需要转换成二进制:private static <T> byte[] toByteArray(T body) { ByteArrayOutputStream baos = null; ObjectOutputStream oos = null; try { baos = new ByteArrayOutputStream(); oos = new ObjectOutp

2021-02-02 23:07:48 2396 1

原创 Android Room数据库使用

Room使用介绍1.创建DatabaseDatabase包含数据库的持有者。作为一个数据库的管理类,必须用注解 @Database 标注,并且满足以下条件:必须是一个抽象类,并且继承 RoomDatabase。 在 Database 的注解内,必须包含一个或者多个和数据库关联的实体类。 包含一个或多个有0个参数的抽象方法,这些方法返回与之关联实体的Dao对象。2.创建Entity代表数据库关联的一个表3.创建Dao包含可以访问数据的方法。Room使用具体分解:步骤1、

2021-02-02 22:57:06 6609 3

原创 Android解析Asset目录下的json文件

在app module中的src/main/assets目录下我们准备了两个json文件:destination.json如下:{ "main/tabs/sofa": { "isFragment": true, "asStarter": false, "needLogin": false, "pageUrl": "main/tabs/sofa", "className": "com.test.ppjoke.ui.notifications.Notif

2021-01-31 09:14:21 1085 2

原创 Android自定义注解生成文件

步骤一:新建注解的java module:新module的gradle配置文件如下:plugins { id 'java-library'}dependencies { implementation fileTree(dir: 'libs', include: ['*.jar'])}java { sourceCompatibility = JavaVersion.VERSION_1_8 targetCompatibility = JavaVersio

2021-01-30 20:56:22 635

原创 面试收集:Android 中关于内存泄露有哪些注意点

内存泄露概述内存泄漏的根本原因是一个长生命周期的对象持有了一个短生命周期的对象,造成短生命周期对象没有办法被回收所导致的。在Android程序开发中,当一个对象已经不需要再使用了,本该被回收时,而另外一个正在使用的对象持有它的引用从而导致它不能被回收,这就导致本该被回收的对象不能被回收而停留在堆内存中,内存泄漏就产生了。内存泄露的危害:只有一个,那就是虚拟机占用内存过高,导致OOM(内存溢出),程序出错。对于Android应用来说,就是你的用户打开一个Activity,使用完之后关闭它,内存泄露

2021-01-30 12:33:38 387 1

原创 Android onSaveInstanceState和onRestoreInstanceState调用时机、及大小限制

对于 Activity 的 onSaveInstanceState 方法大家都不会陌生,当 Activity 在不正常销毁的情况下,就会调用 onSaveInstanceState 方法,并将 Activity 中需要保存的数据(比如 View 状态 或者我们自己的数据)保存到这个方法的参数 Bundle 中。一、onSaveInstanceState(Bundle outState)的调用时机onSaveInstanceState(Bundle outState)会在以下情况被调用:1、当用户按下

2021-01-29 17:01:56 3030 1

原创 kotlin中CoroutineScope CoroutineContext的理解

简单来说,CoroutineScope是启动协程的作用域,所有协程都需要在作用域中启动,并且作用域内部创建子协程则会自动传播给子协程;而CoroutineContext则是在协程作用域中执行的线程切换。1、首先我们来看下Scope作用域的理解,示例代码:import kotlinx.coroutines.launchimport kotlinx.coroutines.runBlockingfun main() { runBlocking { val scope0

2021-01-28 17:35:51 3289 1

原创 kotlin SupervisorJob使用

1、更安全地处理async{}中的异常async构建器启动的协程中发生非CancellationException异常,会向外抛出,让其父协程及其他子协程停止。如下,其中一个子协程(即two)失败,并且它抛出了一个异常,第一个async以及等待中的父协程都会被取消, 所有在作用域中启动的协程都会被取消。import kotlinx.coroutines.*fun main() = runBlocking<Unit> { try { failedCo...

2021-01-28 16:12:07 4983

原创 kotlin flow使用

上例中flow2间隔15毫秒发射一个值,而flow需要500毫秒,那么第45毫秒时flow2已经发射到了第三个值是c,此时combine的第一次合并需要等到flow发射第一个值500毫秒时合并为1c,1秒时合并为2c,1500毫秒时为3c。运行结果即是,每隔1秒钟,打印出来一个数字,emit 方法用于发射值,collect方法是收集值,这里需要注意的是,我们可以看到 在main方法协程中,我们可以直接调用loadData的方法,这是因为flow构建块中的代码 就是一个suspend函数。

2021-01-28 13:51:49 3551

原创 kotlin小结

一、协程相关1-1、协程使用官网例子(组合挂起函数):https://www.kotlincn.net/docs/reference/coroutines/composing-suspending-functions.html1、顺序调用: suspend fun doSomethingUsefulOne(): Int { delay(1000L)// 假设我们在这里做了一些有用的事 return13 } suspend ...

2021-01-16 11:14:18 355

原创 kotlin的协程写法

默认顺序调用假设我们在不同的地方定义了两个进行某种调用远程服务或者进行计算的挂起函数。我们只假设它们都是有用的,但是实际上它们在这个示例中只是为了该目的而延迟了一秒钟: private suspend fun jobOne(): Int { delay(2500) return 1 } private suspend fun jobTwo(): Int { delay(1500) return 2 }

2021-01-13 19:42:09 444

转载 Kotlin协程中的异常

【译】Kotlin协程中的异常一个协程突然失败了!现在该怎么办?????当协程因出现异常失败时,它会将异常传播到它的父级,然后,父级将进行如下三步:1)取消其余的子协程,2)取消自身,3)将异常在传播给它的父级。异常将最终到达当前层次结构的根,在当前协程作用域启动的所有协程都将被取消。协程中的异常将在整个协程层次结构中传播虽然在某些情况下传播异常是有意义的,但是大多数情况下这样做是不可取的。设想一个处理用户交互的与UI相关的协程作用域,如果一个子协程抛出了异常,UI的作用域将

2021-01-10 11:38:47 897

翻译 Kotlin协程的取消

【译】Kotlin协程的取消原文:Cancellation in coroutines作者:Florina Muntenescu译者:luckykelan取消正在进行的协程当启动多个协程时,逐个跟踪或取消它们可能会很麻烦,但是我们可以依靠取消父协程或协程作用域,因为这将取消它创建的所有协程。//假设我们已经为以下代码定义了一个作用域scopeval job1 = scope.launch {...} val job2 = scope.launch {...} scope.

2021-01-10 11:37:11 1495

原创 Kotlin异步流

异步流挂起函数异步返回一个值, 而 Kotlin 的异步流返回多个值, 与 RxJava 中的流类似.序列 (Sequences)首先介绍一个数据类型, 序列(Sequences)表示一个延迟计算( lazily evaluated )的集合. 这里延迟即意味着异步, 或者惰性求值. 要取得它的值, 迭代它即可, 它有返回一个迭代器 (Iterator) 的方法, 所以可以在迭代器上进行各种方便的操作, 如filter,take,map等. 因为它是惰性求值的, 所以这个集合的元素可能是无限..

2021-01-10 11:25:57 1161

原创 kotlin协程教程

Kotlin 协程教程什么是协程协程就像非常轻量级的线程。线程是由系统调度的,线程切换或线程阻塞的开销都比较大。而协程依赖于线程,但是协程挂起时不需要阻塞线程,几乎是无代价的,协程是由开发者控制的。所以协程也像用户态的线程,非常轻量级,一个线程中可以创建任意个协程。协程的创建线程的创建方式主要有两种, 继承Thread, 或者实现Runnable接口, 而协程而是通过构建器(coroutine builder方法), 有点类似工厂方法, 调用一个静态工厂方法就可以返回一个协程.corout

2021-01-10 11:22:47 1450

原创 kotlin协程的生命周期与jetpack组件绑定

Android 如何使用协程安卓上, 协程可以帮忙解决两大问题:管理长时间运行的任务, 这些任务可能阻塞主线程, 导致 UI 卡顿. 在主线程上安全地调用网络或磁盘操作.安卓上使用协程的最好方式是使用官方的架构组件, 它们提供了对协程的支持. 目前ViewModel,Lifecycle,LiveData,Room组件提供了对协程一等的支持.ViewModelScope对ViewModel的支持主要是在ViewModel上提供了一个称为ViewModelScope的...

2021-01-10 11:18:00 1055

原创 Jetpack LifeCycle极简使用

使用方式一:继承自AppCompatActivityclass MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) lifecycle.addObserver(object

2021-01-09 16:18:48 159

转载 Jetpack Lifecycle使用

Lifecycle 的作用Lifecycle 是具有生命周期感知能力的组件,也就是说,我们能在 Activity 或者 Fragment 的生命周期发生变化的时候得到通知。我们往往会在 Activity 的各种生命中周期方法里执行特定的方法,比如,进行广播的注册和解绑、Eventbus 的注册和解绑等:public class TestActivity extends AppCompatActivity { @Override protected void onCreate(Bu

2021-01-09 15:58:56 186

原创 依赖注入框架Koin(二)快速上手

一、集成Koin依赖包的添加//1、在project的build.gradle下,buildScript的dependencies添加 classpathbuildscript { repositories { jcenter() } dependencies { classpath "org.koin:koin-gradle-plugin:$koin_version" }}//2、应用koin插件apply plugin:

2021-01-03 17:13:58 767

原创 依赖注入框架Koin(一)知识预览

一、基础概念依赖注入(Dependency Injection)和控制反转(Inversion of Control)是同一个概念。具体含义是:当某个角色(可能是一个Java实例,调用者)需要另一个角色(另一个Java实例,被调用者)的协助时,在传统的程序设计过程中,通常由调用者来创建被调用者的实例。但在Spring里,创建被调用者的工作不再由调用者来完成,因此称为控制反转。创建被调用者实例的工作通常由Spring容器来完成,然后注入调用者,因此也称为依赖注入。DI依赖注入框架的优点:

2021-01-03 16:22:49 2141

原创 Jetpack Room数据库(三)源码简析

一、源码架构 room-common、room-runtime、room-ktx三个依赖library CRUD实质使用原生sqlite操作 room内生支持liveData&coroutines 源码概览 Room-Ktx 扩展函数 1. CoroutinesRoom.createFlow/execute//支持协程flow 数据流操作​//支持协程调度器2. CoroutinesRoomKt:>>RoomDat.

2021-01-03 15:15:10 382 2

原创 Jetpack Room数据库(二)进阶使用

一、原有表中添加另外对象--嵌套类使用嵌套类:在原有的表中需要添加另外一个实体类时,可以使用嵌套类。@embedded,将额外对象的内容字段,添加到当前entry的表内,所以,其字段不可与当前entry字段重复例如原来的数据实体类叫DBUser,此时我们需要将另外一个实体类Child的相关属性也添加到原来DBUser表中。首先定义一个Child类,需要注意的是Child类中的属性字段不能够和原来的DBUser中的字段重复,因为最后Child的字段是和DBUser插入到同一个表中的,.

2021-01-03 13:08:09 672 3

原创 Jetpack Room数据库(一)快速上手

一、基础知识1、依赖库 implementation 'androidx.room:room-runtime:2.2.5' implementation 'androidx.room:room-common:2.2.5' implementation 'androidx.room:room-ktx:2.2.5' kapt "androidx.room:room-compiler:2.2.5"2、特性 SQL语句高亮 简单入门 功能强大...

2021-01-03 11:52:13 366

matjava1.8.rar

MAT旧版本可以用java1.8打开

2021-09-14

PixelRulers.rar

PixelRulers.rar

2021-01-20

Windows环境下32位汇编语言

2016-06-09

登陆成功界面

登陆成功界面

2015-07-21

bootstrap首页制作

bootstrap首页制作,酷炫效果,可以学习使用。

2015-07-21

空空如也

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

TA关注的人

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