自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(37)
  • 收藏
  • 关注

原创 synchronized

使用场景

2021-09-05 23:57:53 81

原创 Android- application

application

2021-09-05 23:57:15 101

原创 4、异常类都有哪些?Exception 和 Error什么区别?

异常类都有哪些?Exception 和 Error什么区别?

2021-05-10 15:56:44 180

原创 3. HashMap 实现数据结构和扩容过程?

HashMap 实现数据结构和扩容过程?

2021-05-10 15:54:23 138

原创 2、ArrayList 和 LinkedList

ArrayList 和 LinkedList 区别?

2021-05-10 15:53:46 59

原创 ImageLoader的实现

一般来说,一个优秀的ImageLoader应该具备如下功能:a. 图片的同步加载b. 图片的异步加载c. 图片压缩d. 内存缓存 (ImageLoader核心)e. 磁盘缓存 (ImageLoader核心)f. 网络拉取

2021-04-27 13:17:25 78

原创 手写单例模式

// 双重检测public class Singleton {private static volatile Singleton singleton;private Singleton() {}public static Singleton getInstance() { if (singleton == null) { synchronized (Singleton.class) { if (singleton == null) {

2021-04-25 10:14:06 52

原创 Anr

anr

2021-04-25 00:53:07 305

原创 java基础

1、谈谈你对java平台的理解?“java是解释执行”,这句话正确吗?Java本身是一种面向对象的语言,最显著的特性有两个方面:1)“书写一次,到处运行”,能够非常容易获得跨平台能力2) 垃圾回收(GC),Java通过垃圾回收期回收分配内存,大部分情况下,程序员不需要自己操心内存的分配和回收。2、如何保证容器是线程安全的?ConCurrentHashMap如何实现高效的线程安全?Java提供了不同层面的线程安全支持,在传统集合框架内部,除了Hashtable等同步容器,还提供了所谓的同步包装器,我

2021-04-24 12:14:05 56

原创 Glide

1、图片的三级缓存1)图片三级缓存就是内存-文件-网络 三层 cache 机制,其中内存缓存包括强引用缓存和软引用缓存(SoftReference)。通过 url 向网络获取图片的时候,先从内存中找,如果内存中没有,再从缓存文件中查找,如果缓存文件中也没有,再从网络上通过 http 请求获取图片。在键值对(key-value)中, 图片缓存的key 是图片 url 的 hash 值,value 就是 bitmap。所以,只要一个 url 被下载过,其图片就被缓存起来了。2)从代码上来说,采用一个 Ima

2021-04-22 13:53:29 71

原创 java基础知识

1、Interface和Abstract的区别共同点A.两者都是抽象类,都不能实例化B.Interface实现类和abstract继承类都必须实现抽象方法不同点A.Interface需要实现,用implements; Abstract 需要继承,用exendsB.一个类可以实现多个Interface; 一个类只能继承一个AbstractC.Interface强调功能的实现;Abstract强调从属关系D.Interface的所有抽象类都只有声明没有方法体;Abstract抽象方法可以选择实现

2021-04-21 10:37:30 39

原创 AIDL

AIDL 是Android 进程间通信的一种方式。 它的底层是通过binder实现的。1、默认支持的数据类型包括:1)Java中的八种基本数据类型,包括 byte,short,int,long,float,double,boolean,char。2)String 类型。3)CharSequence类型。4)List类型:List中的所有元素必须是AIDL支持的类型之一,或者是一个其他AIDL生成的接口,或者是定义的parcelable(下文关于这个会有详解)。List可以使用泛型。5)Map类型

2021-04-20 14:06:41 76

原创 MediaSession

MediaSession这种媒体框架由MediaBrowser(媒体浏览器)和MediaBrowserService(媒体浏览器服务)两部分组成。主要作用是规范了媒体服务和界面的通信接口,达到了完全解耦,可以自由、高效进行不同的媒体的切换。1、简单描述一下:1)MediaBrowser:媒体浏览器,用来连接服务,在连接成功的结果回调后,获取token(配对令牌),并以此获得MediaController媒体控制器。同时,有订阅并设置订阅信息回调的功能。2)MediaController:媒体控制器,可

2021-04-20 11:17:11 285

原创 LeakCanary

1、引入debugCompile ‘com.squareup.leakcanary:leakcanary-android:1.6.1’releaseCompile ‘com.squareup.leakcanary:leakcanary-android-no-op:1.6.1’2、使用LeakCanary.install(this);3、原理LeakCanay的入口是在application的onCreate()方法中声明的,其实用的就是Application的ActivityLifecycleC

2021-04-20 11:04:05 96

原创 Android Jetpack

android jetpack是google专门为开发者快速开发app的一套组件,快速搭建mvvm框架的实现,其中包括Lifecyle、LiveData、ViewModel、Room、DadaBinding、Navigation、Paging、WorkManager等一系列优秀的框架。Lifecycle:实现和activity、fragment生命周期感知的框架,实现数据层和view层销毁的时候解绑。原理是Lifecycler为每个活动组件添加了一个没有界面的Fragment,利用Fragment周期会根

2021-04-20 10:29:40 65

原创 RxJava 的线程切换原理

RxJava 的线程切换原理RxJava通过subscribeOn指定被观察者发生的线程,observeOn指定观察者发生的线程。其中Schedulers.IO生成的是IoScheduler。通过观察者与被观察者订阅的过程中,首先会触发被观察者的subscribeActual方法,在该方法中,可以看到最终会走scheduler的schedule方法,所以上面提到的IoScheduler实际是调用了它的schedule方法,最终会在NewThreadWorker里面生成ScheduledEx

2021-04-20 10:17:20 374

原创 OkHttp

1、简述一下OkHttp它是一个非常优秀的网络请求框架,已被google加入到Android的源码中。目前比较流行的Retrofit也是默认使用的Okhttp。1)支持http2,对一台机器的所有请求共享同一个socket2)内置连接池,支持连接服用,减少延迟3)支持透明的gzip压缩响应体4)通过缓存避免重复的请求5)请求失败时自动重试主机的其他ip,自动重定向6)好用deAPI2、使用1)创建OkHttpClient对象:OkHttpClient client = new OkHttp

2021-04-15 10:19:34 131

原创 Retrofit

1.动态代理创建一个接口的代理类2.通过反射解析每个接口的注解、入参构造 http 请求3.获取到返回的 http 请求,使用 Adapter 解析成需要的返回值

2021-04-15 08:17:10 82

原创 Android-Application的理解

1、Application的作用1)保存应用进程内的全局变量2)初始化操作3)提供应用上下文2、Application的继承以及声明周期1)class Application extends ContextWrrapperContextWrrapper extends Context2)构造函数、attachBaseContext、 onCreate3、Application初始化原理待补充...

2021-04-14 20:45:40 95

原创 ContentProvider

1.请介绍下 ContentProvider 是如何实现数据共享的在 Android 中如果想将自己应用的数据(一般多为数据库中的数据)提供给第三发应用,那么我们只能通过 ContentProvider 来实现了。ContentProvider 是应用程序之间共享数据的接口。使用的时候首先自定义一个类继承 ContentProvider,然后覆写 query、insert、update、delete 等方法。因为其是四大组件之一因此必须在 AndroidManifest 文件中进行注册。把自己的数据通过

2021-04-14 10:18:04 92

原创 hashmap

hashmap是我们在开发中经常用到的一个集合类,它以键值对的形式进行存储。在jdk1.7到1.8之间 他的实现略有区别 两个重要的区别 在1.7的时候 采用的是数组加链表 1.8采用的数组加链表加红黑树 红黑树的引入是为了提高他的查询效率 因为链表的查询复杂度为O (n) 红黑树是O(logN)在1.7之前遇到哈希碰撞需要在链表上添加数据的时候采用的是头插法 1.8之后改用尾插法 头插法在多线程会导致一些问题 比如它会形成循环链表 而耗尽我们cpu的性能 为了解决这个问题 在1.8之后采用了尾插法 当然在

2021-03-30 14:29:07 75

原创 Android 17题

1、ArrayList 和 LinkedList 的区别,以及应用场景ArrayList 是基于数组实现的,ArrayList 线程不安全。LinkedList 是基于双链表实现的:使用场景:1)如果应用程序对各个索引位置的元素进行大量的存取或删除操作,ArrayList对象要远优于 LinkedList 对象;2) 如果应用程序主要是对列表进行循环,并且循环时候进行插入或者删除操作,LinkedList 对象要远优于 ArrayList 对象;2、数组和链表的区别1)数组:是将元素在内存中连

2021-03-30 14:24:35 101

原创 RxAndroid

RxAndroid 只是提供一个能切换到 Android 主线程线程调度器。其实 RxAndroid 的核心就是 Handler。private static final class MainHolder {static final Scheduler DEFAULT = new HandlerScheduler(new Handler(Looper.getMainLooper()));}private static final Scheduler MAIN_THREAD = RxAndro

2021-03-29 17:40:39 84

原创 ThreadLocal

ThreadLocal是什么?提供了线程本地的实例。它与普通变量的区别在于,每个使用该变量的线程都会初始化一个完全独立的实例副本。ThreadLocal变量通常被private static修饰。当一个线程结束时,它所使用的所有ThreadLocal相对的实例副本都可被回收。解决什么问题一个线程内变量共享,减少同一个线程内多个函数或组件之间一些公共变量传递的复杂度使用场景ThreadLocal 适用于每个线程需要自己独立的实例且该实例需要在多个方法中被使用,也即变量在线程间隔离而在方法..

2021-03-29 16:29:05 83

原创 android 30题

1、java 中和 equals 和 hashCode 的区别基本数据类型的比较的值相等.类的==比较的内存的地址,即是否是同一个对象,在不覆盖 equals 的情况下, 同比较内存地址,原实现也为 == ,如 String 等重写了 equals 方法.hashCode 也是 Object 类的一个方法。返回一个离散的 int 型整数。在集合类操作中使用,为了提高查询速度。(HashMap,HashSet 等比较是否为同一个)如果两个对象 equals,Java 运行时环境会认为他们的 hashc

2021-03-27 16:37:32 147

原创 Android--进程的启动流程

1.进程的启动流程1 ) startActivity开始,跨进程调用AMS.拿到AMS的代理对象,调用startActivity通过mRemote.transact()发送请求,把请求的数据封装到data中写入binder驱动,转发到AMSAMS收到onTransact的回调.然后在AMS中startActivity()–> 在ActivityStackSupervisor里调用startSpecificActivityLocked()2 ) 在AMS里先检查进程是否启动了。检查进程启动的标志

2021-03-24 22:06:27 395

原创 Handler二十七问

Handler被设计出来的原因?有什么用?为什么建议子线程不访问(更新)UI?子线程访问UI的 崩溃原因 和 解决办法?MessageQueue是干嘛呢?用的什么数据结构来存储数据?延迟消息是怎么实现的?MessageQueue的消息怎么被取出来的?MessageQueue没有消息时候会怎样?阻塞之后怎么唤醒呢?说说pipe/epoll机制?同步屏障和异步消息是怎么实现的?同步屏障和异步消息有具体的使用场景吗?Message消息被分发之后会怎么处理?消息怎么复用的?Looper是干嘛呢.

2021-03-24 21:40:47 76

原创 Android--网络编程

1、网络分层OSI 七层模型OSI 七层协议模型主要是:应用层(Application)、表示层(Presentation)、会话层(Session)、传输层(Transport)、网络层(Network)、数据链路层(Data Link)、物理层(Physical)。2、TCP/IP 五层模型TCP/IP 五层模型:应用层(Application)、传输层(Transport)、网络层(Network)、 数据链路层(Data Link)、物理层(Physical)。3、三次握手与四次挥手第

2021-03-22 15:07:59 41

原创 Android--数据存储

1、Android 数据持久存储方式Android 平台实现数据持久存储的常见几种方式:1) SharedPreferences 存储:一种轻型的数据存储方式,本质是基于 XML 文件存储的 key-value 键值对数据,通常用来存储一些简单的配置信息(如应用程序的各种配置信息);2) SQLite 数据库存储:一种轻量级嵌入式数据库引擎,它的运算速度非常快,占用资源很少,常用来存储大量复杂的关系数据;3) ContentProvider:四大组件之一,用于数据的存储和共享,不仅可以让不同应用程序

2021-03-21 12:08:35 79

原创 Binder

1、Binder 机制的作用和原理?1) Linux 系统将一个进程分为用户空间和内核空间。对于进程之间来说,用户空间的数据不可共享,内核空间的数据可共享,为了保证安全性和独立性,一个进程不能直接操作或者访问另一个进程,即 Android 的进程是相互独立、隔离的,这就需要跨进程之间的数据通信方式。2) 一次完整的 Binder IPC 通信过程通常是这样:a. 首先 Binder 驱动在内核空间创建一个数据接收缓存区;b. 接着在内核空间开辟一块内核缓存区,建立内核缓存区和内核中数据接收缓存区之间

2021-03-21 11:52:31 72

原创 Android--性能优化

1、性能优化,怎么保证应用启动不卡顿? 黑白屏怎么处理?1 ) 应用启动速度,取决于你在 application 里面时候做了什么事情,比如你集成了很多 sdk,并且 sdk 的 init 操作都需要在主线程里实现所以会有卡顿的感觉。在非必要的情况下可以把加载延后或则开启子线程处理2)另外,影响界面卡顿的两大因素,分别是界面绘制和数据处理。a. 布局优化(使用 include,merge 标签,复杂布局推荐使用 ConstraintLayout 等)b. onCreate() 中不执行耗时操作 把

2021-03-21 11:47:26 135

原创 android--线程

1、线程池的优点? 四种线程池的使用场景,线程池的几个参数的理解?1) 使用线程池的好处是减少在创建和销毁线程上所花的时间以及系统资源的开销,解决资源不足的问题。如果不使用线程池,有可能造成系统创建大量同类线程而导致消耗完内存或则“过度切换”的问题,归纳总结就是a. 重用存在的线程,减少对象创建、消亡的开销,性能佳。b. 可有效控制最大并发线程数,提高系统资源的使用率,同时避免过多资源竞争,避免堵塞。c. 提供定时执行、定期执行、单线程、并发数控制等功能。2)Android 中的线程池都是直接

2021-03-21 11:37:04 71

原创 设计模式

谈谈 MVC、MVP 和 MVVM,优点及缺点 ?1 ) MVC:a. 视图层(View) 对应于 xml 布局文件和 java 代码动态view 部分b. 控制层(Controller) MVC 中 Android 的控制层是由Activity 来承担的,Activity 本来主要是作为初始化页面,展示数据的操作,但是因为 XML 视图功能太弱,所以 Activity 既要负责视图的显示又要加入控制逻辑,承担的功能过多。c. 模型层(Model) 针对业务模型,建立数据结构和相关的类,它主要负责.

2021-03-21 11:16:43 59

原创 android--service与Broadcast Receiver

Service1、谈一谈 Service 的生命周期?Service 的生命周期涉及到六大方法1)onCreate():如果 service 没被创建过,调用startService()后会执行 onCreate()回调;如果 service已处于运行中,调用 startService()不会执行 onCreate()方法。也就是说,onCreate()只会在第一次创建 service时候调用,多次执行 startService()不会重复调用onCreate(),此方法适合完成一些初始化工作;2)

2021-03-21 10:58:38 494

原创 Android--Fragment

1、谈一谈 Fragment 的生命周期?Fragment 从创建到销毁整个生命周期中涉及到的方法依次为:onAttach()→onCreate()→onCreateView()→onActivityCreated()→onStart()→onResume()→onPause()→onStop()→onDestroyView()→onDestroy()→onDetach(),其中和 Activity 有不少名称相同作用相似的方法,而不同的方法有:1) onAttach():当 Fragment 和

2021-03-20 23:03:03 100

原创 Android---Activity

1、说下 Activity 生命周期 ?在正常情况下,Activity 的常用生命周期就只有如下 7 个1 ) onCreate():表示 Activity 正在被创建,常用来初始化工作,比如调用 setContentView 加载界面布局资源,初始化 Activity 所需数据等;2 ) onRestart():表示 Activity 正在重新启动,一般情况下,当前Acitivty 从不可见重新变为可见时,OnRestart 就会被调用;3 ) onStart():表示 Activity 正在被启

2021-03-20 22:35:53 91

原创 安卓消息机制Handler

1、谈谈消息机制 Handler 作用 ?有哪些要素 ?流程是怎样的 ?1) 负责跨线程通信,这是因为在主线程不能做耗时操作,而子线程不能更新 UI,所以当子线程中进行耗时操作后需要更新 UI时,通过 Handler 将有关 UI 的操作切换到主线程中执行。2) 具体分为四大要素a. Message(消息):需要被传递的消息,消息分为硬件产生的消息(如按钮、触摸)和软件生成的消息。b. MessageQueue(消息队列):负责消息的存储与管理,负责管理由 Handler 发送过来的 Mes

2021-03-20 22:15:50 255 3

空空如也

空空如也

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

TA关注的人

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