自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Glide详解

如果磁盘缓存中也不存在,则会根据图片来源(如网络、本地文件等)发起相应的请求下载图片,并将下载的图片缓存到内存缓存和磁盘缓存中,以便下次快速访问。发起加载图片请求:发起加载图片请求当我们用 into方法加载图片时,就是发起了一次图片加载请求,这个请求会被Glide封装成一个Request对象,并交给RequestManager来处理。Glide使用了三级缓存机制,图片的缓存分为内存、磁盘和来源,也就是从内存获取不到图片时,再去磁盘获取图片,从磁盘获取不到图片时,再从图片来源获取图片。-加载指定格式的图片。

2023-11-07 23:53:06 167

原创 OkHttp详解

同样,默认为10秒。应用拦截器是最先执行的拦截器,也就是用户自己设置request属性后的原始请求,而网络拦截器位于ConnectInterceptor和CallServerInterceptor之间,此时网络链路已经准备好,只等待发送请求数据,需要注意的是,连接池会根据一定的策略来管理连接的过期和闲置时间,以保证连接的有效性和可复用性。4. ConnectInterceptor(链接拦截器):这个拦截器用于与服务器完成TCP连接,内部维护一个连接池,处理连接的生命周期,包括连接的创建、复用和关闭等。

2023-11-07 23:50:56 671

原创 Android权限

这个 Activity 主要用于请求电话拨打权限并拨打电话,在onCreate方法中,通过点击bt控件来申请获取权限,首先在if中会检查当前应用是否已经获得了拨打电话的权限。如果没有,就会执行大括号内的代码,会弹出一个对话框,询问用户是否授予应用拨打电话的权限.如果已经有权限了就会直接调用call()方法执行。2.运行时权限:运行时权限比较敏感一点了,它是指应用运行的过程中,当应用需要使用某项特定功能时,系统会弹出窗口询问用户是否授予这项权限。因此需要先在应用中请求运行时权限然后才能访问受限数据或操作。

2023-11-04 12:37:19 51 1

原创 Android 应用打包

3.然后我们点击Android Studio右侧的Gradle,接着可以跟着下面图片指示的路径,可以看到刚才我们编辑的4个渠道都在,我们可以单独对某个渠道进行打包,或者直接选择assemble对所有渠道都进行打包,打包完成之后在build路径下的outputs包里查看。多渠道打包是指在应用程序打包的过程中,针对不同的应用市场或发布渠道生成不同的APK文件。每个APK文件都具有相同的应用功能和逻辑,但可能会有不同的应用名称、图标、启动页等。4.进入以下页面之后选择点击新建签名,如果有就不用了。

2023-11-04 12:33:14 145 1

原创 Handler

而使用Handler可以将要更新UI控件的操作封装成一个消息,然后通过Handler发送到主线程中,由主线程中的Handler接收并处理消息,从而实现在子线程中更新UI控件的目的。常见于Handler是非静态的持有外部内的引用,发送延时消息时,Message的target是Handler的强引用,而Handler持有外部Activity的引用,由于Message在MessageQueue里,所以导致外部Activity无法被回收导致的内存泄漏。我们可以把线程看成一个人,每个人都有自己的任务。

2023-11-04 12:32:43 53 1

原创 Service 组件

通过bindService()启动,service的生命周期与启动的Activity绑定,service生命周期受到Activity的影响,当Activity被销毁时,service也将会被销毁。通过startService()方式启动service,service的生命周期与启动的Activity无关,意味着当启动的Activity被销毁时service不会被销毁。Service有两种方式启动,一种是通过startService()启动,另一种是通过bindService()方式启动。

2023-10-31 13:50:25 33 1

原创 Android ContentProvider 组件

在使用ContentProvider时,定义URI匹配规则是很重要的,URI匹配规则决定了哪个ContentProvider能够处理特定的URI请求,当有多个ContentProvider存在时,定义的匹配规则可以确保每个请求都会被正确地路由到对应的ContentProvider。这样,不同的ContentProvider可以处理不同的数据集,确定操作类型,保证数据的隔离和安全。

2023-10-31 13:48:02 62 1

原创 Java的泛型与反射

反射是指程序在运行时通过字节码和对象,可以获取虚拟机中任意对象的所有信息,包括属性、方法等等。利用反射,我们可以轻松地获取并操作对象的各种信息。

2023-10-31 13:47:22 45 1

原创 Java设计模式

单例模式的定义就是保证一个类只有一个实例,并提供全局访问点,其中单例模式又分为懒汉式和饿汉式,我们一起来看一下饿汉式:// 私有构造函数,避免外部创建对象饿汉式的单例模式在类加载的时候就会创建好实例,因此不存在线程安全问题,但是可能会浪费一些内存资源懒汉式// 私有构造函数,避免外部创建对象if (INSTANCE == null){//为空了再new,不为空则不new懒汉式的单例模式是指在第一次使用时才会创建实例,可以延迟实例化的时机,避免了饿汉式的资源浪费问题。

2023-10-26 14:33:57 23

原创 Java 集合

深拷贝和浅拷贝是关于对象拷贝的两个概念,一句话描述的话就是浅拷贝只复制了对象本身和其引用,而深拷贝将对象及其引用的对象一同复制深拷贝:深拷贝是指创建一个新对象以及该对象的所有引用类型属性所引用的对象的拷贝。深拷贝会复制对象及其引用的所有对象,确保每个对象都是独立的,修改其中一个对象不会影响其他对象。浅拷贝:浅拷贝是指创建一个新对象,该对象的属性值与原始对象相同,但是引用类型的属性仍然指向原始对象中的相同对象。简单说就是浅拷贝只是复制了对象的引用而不是实际的数据。

2023-10-26 12:00:22 28

原创 线程池的运用

当向线程池提交任务后,线程池会在内部将任务封装为一个 Worker,并将其放入线程池中进行执行,Worker线程会调用其线程对象的 start 方法,从而运行 Worker 的 run 方法。CachedThreadPoo(可缓存线程):线程池的核心线程数为0,最大线程数为Integer.MAX_VALUE,当有新任务提交时,会尝试复用已有线程执行任务,如果没有可用的线程,则创建新线程执行任务。corePoolSize(核心线程数):线程池维护线程的最少线程数量。线程池的原理在于7个核心参数。

2023-10-26 11:59:41 31

原创 线程,多线程

首先出现线程安全问题是因为在多线程的情况下,因为线程之间的执行是没有规律的,当多个线程访问一个共同的数据进行读写时导致最终结果不正确所出现的问题,而避免这种问题实现线程安全的方式可以使用volatile关键字对这个公共变量进行修饰,保证不同线程对这个变量进行操作时的一致可见性,还有使用锁机制synchronized,在线程访问某个数据时进行加锁操作,这个时候其它线程不能进行访问,只能等该线程读取完成并释放锁后其它线程才能继续访问。

2023-10-26 11:58:59 23

原创 自定义异常的运用

自定义异常分为自定义运行时异常,和自定义非运行时异常,自定义运行时异常,需要继承自RuntimeException或者任意运行时异常的类,自定义非运行时异常,需要继承自Exception或者任意非运行时异常的类。

2023-09-26 23:59:04 138 1

原创 对排序的重新理解

通过这个索引值和外层的循环i进行比较,如果不等于i则就可以进行交换,然后继续进行下一轮的排序,每一轮选择最小的元素放到前面就行。-将当前元素与已排序部分的元素比较,找到合适的位置并插入,跟前面的排序一样,通过一个临时变量进行替换操作。判断当前索引值值和下一个元素的大小关系,如果后者更小,则赋值更新索引值。-遍历剩余元素,将当前元素插入到已排序部分的确位置去。遍历要排序的素列表,然后将当前的位置设置一个索引值。-将列表的第一个元素设为已排序的部分。

2023-09-22 03:12:20 28 1

原创 生产者和消费者

【代码】生产者和消费者。

2022-09-26 15:43:46 46 2

原创 生产者和消费者

【代码】生产者和消费者。

2022-09-26 15:37:41 87

空空如也

空空如也

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

TA关注的人

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