- 博客(110)
- 资源 (6)
- 收藏
- 关注
原创 Java实现生产者/消费者模式
import java.util.LinkedList;import java.util.Queue;public class ProducerConsumerTest { public static void main(String[] args) { final Queue<Integer> sharedQueue = new LinkedList<>(); Thread producer = new Producer(shared.
2022-02-16 11:01:28
1166
1
转载 Android开发@IntDef完美替代Enum (枚举)
概要Enum 是 java 中一种包含固定常数的类型,当我们需要预先定义一些值时,我们使用 Enum,这样做通常为了在编译时期避免接受额外常量引起的错误。而且,Enum 增加了APK 的大小,比常量多5到10倍的内存占用,这是关于应用性能的最佳实践.使用 Enum 的缺点每一个枚举值都是一个对象,在使用它时会增加额外的内存消耗,所以枚举相比与 Integer 和 String 会占用更多的内存。较多的使用 Enum 会增加 DEX 文件的大小,会造成运行时更多的开销,使我们的应用需要更多
2022-02-04 17:05:27
788
转载 浅谈将子类对象赋值给父类对象
浅谈将子类对象赋值给父类对象_大黑找小白-CSDN博客_子类对象赋值给父类对象最近对将子类对象赋值给父类对象有点心得,想和大家分享一下,但本人水平有限,请各位指正和批评。言归正传,下面是几个小例子,请大家看一看。测试一 父类:public class Supclass { public void print() { System.out.println("this is 父类print()方法" + "——此时对象" + this.toStringhttps://blog.csdn.net/u0125662
2022-01-22 13:35:42
754
原创 repo sync出错整理
repo sync出错整理1. 出现contains uncommitted changes错误1.1. 出现error: .repo/manifests/: contains uncommitted changes错误原因:修改了.repo/manifests目录下的东西,但没提交导致的解决方法:$ cd .repo/manifests$ git reset --hard HEAD~3$ cd -$ repo sync...
2022-01-22 10:05:34
1794
原创 Fragment切换replace和(add-hide-show)
Fragment的切换中有两种方式----方式1使用replace直接切换;方式2使用add先添加Fragment,然后再使用hide隐藏不显示的Fragment,最后再用show将需要显示的Fragment显示出来下面将介绍下这两种方式:方式1:使用replace使用replace切换Fragment的代码如下:FragmentManager fm = getSupportFragmentManager();FragmentTransaction ft = fm.beginTran.
2022-01-20 14:25:20
2433
转载 RecyclerView setHasFixedSize(true)的意义
/** * RecyclerView can perform several optimizations if it can know in advance that RecyclerView's * size is not affected by the adapter contents. RecyclerView can still change its size based * on other factors (e.g. its parent's size) ..
2022-01-14 10:15:56
505
转载 RecyclerView用法--展示多种类型Item数据
如题,本文主要介绍RecyclerView的基本使用方法,像ListView一样展示多种类型的Item数据。首先构造一个实体类:ItemPO,用来表示每个Item代表的数据类型:import java.io.Serializable; public class ItemPO implements Serializable { private static final long serialVersionUID = 7879752396036182745L; private
2022-01-04 14:54:14
1098
原创 Android9.0 无锁屏下连续锁屏-解屏2次,画面点击无响应 bug 解决办法
修改不了系统源码的,只能在应用程序中修改 softInputMode,亲测可完美解决!@Overrideprotected void onStart() { super.onStart(); WindowManager.LayoutParams attributes = this.getWindow().getAttributes(); attributes.softInputMode = WindowManager.LayoutParams.SOFT_INPUT_STAT.
2021-12-20 17:46:38
1409
原创 Android 7.0及其以上版本获取Mac地址
/** * 通过网络接口取 * @return */ private static String getNewMac() { try { List<NetworkInterface> all = Collections.list(NetworkInterface.getNetworkInterfaces()); for (NetworkInterface nif : all) { ...
2021-12-16 15:38:32
596
原创 Android ImageView旋转动画抗锯齿简洁方式
通过画布配置:canvas.setDrawFilter(new PaintFlagsDrawFilter(0, Paint.ANTI_ALIAS_FLAG|Paint.FILTER_BITMAP_FLAG));import android.content.Context;import android.graphics.Canvas;import android.graphics.Paint;import android.graphics.PaintFlagsDrawFilter;impo
2021-12-15 10:09:34
2515
1
原创 Android Recyclerview设置Item之间的间距
其实不需要自定义LinearLayout.LayoutParams 跟RecyclerView.ItemDecoration。假设:要在recycleView的每条item的下加一个8dp的边距:第一步:在每个item的布局的根布局加上paddingBottom。<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/andr
2021-12-08 16:01:07
4722
2
原创 AndroidStudio 加载系统源码流程(一)
1.Android Studio 开启前配置:**调整内存大小: ** Android Studio需要大量的内存来加载Android源码,所以经常会遇到内存不足的问题, 需要加大内存.1.点击Help->Edit Custom VM Options, 比如 “-Xms4096m -Xmx4096m”2. 修改android-studio/bin/studio.vmoptions studio64.vmoptions 两个文件的以下属性就可以了-Xms2048m-Xmx2048m.
2021-12-01 15:08:21
2756
原创 Android Studio中解决framwork.jar和SDK api冲突的方法
Android Studio中解决framwork.jar和SDK api冲突的方法Android开发中,系统工程师可能需要在系统层添加接口,这些新加的接口在Android Studio应用调用时常常会因找不到接口而导致编译不通过。现以SetupWizard_oem应用为例来说明解决方法。一、添加相应的Jar包到编译环境。out\target\common\obj\JAVA_LIBRARIES\framework_intermediates\classes-full-debug.jar取出该jar放置到
2021-11-26 15:04:33
1066
转载 使用Android Studio 开发 SystemUI
由于用sublime或没有完整依赖的Studio来开发SystemUI非常难受,所以有了这篇分享,目标是做到像普通应用一样在Android Studio里开发SystemUI,可以正常跳转,正常依赖,正常编译,一键安装。1. 将源码放置到成正常gradle项目的结构2. 将资源目录分类存放 sourceSets { main { res.srcDirs += "src/main/res-flyaudio" res....
2021-11-23 15:32:26
1950
转载 Android apk签名详解——AS签名、获取签名信息、系统签名、命令行签名
Apk签名,每一个Android开发者都不陌生。它就是对我们的apk加了一个校验参数,防止apk被掉包。一开始做Android开发,就接触到了apk签名;后来在微信开放平台、高德地图等平台注册时,需要填写apk签名的md5值和sha256值;再后来做系统应用,接触到了系统签名;而后就想了解下apk的生成机制,学习了如何用命令行进行签名。...
2021-11-15 23:34:46
15260
原创 如何处理线程的返回值
实现的方法有三种 主线程等待法 让主线程使用while循环不断的去查询成员变量, 直到成员变量符合条件为止 缺点 当需要等待的线程多起来之后, 代码就会臃肿 循环一次的时间不好确定 使用Thread的join方法阻塞当前线程, 直到子线程执行完毕 public class Demo01 implements Runnable { private static String value; @Override public void run()
2021-10-07 18:13:18
685
转载 APP性能优化系列:内存优化-内存泄露详解
转自http://blog.csdn.net/a910626/article/details/50849760一.内存泄露概念 在java中,如果一个对象没有可用价值了,但又被其他引用所指向,那么这个对象对于gc来说就不是一个垃圾, 所以不会对其进行回收,但是我们认为这应该是个垃圾,应该被gc回收的。这个对象得不到gc的回收, 就会一直存活在堆内存中,占用内存,就跟我们说的霸着茅坑不拉屎的道理是一样的。这样就导致了内存的泄露。 为什么会内存泄露呢,根本原因就是一个永远不会被使用的对象,因为
2021-10-06 18:58:00
1419
转载 简单工厂、工厂方法、抽象工厂区别与联系
工厂模式按照对类的抽象程度可以划分为如下三种类型1)简单工厂模式(Simple Factory)2)工厂方法模式(Factory Method)3)抽象工厂模式(Abstract Factory)简单工厂:定义:是由一个工厂对象决定创建出哪一种产品类的实例。简单工厂模式中包含的角色及其相应的职责如下:工厂角色(Creator):这是简单工厂模式的核心,由它负责创建所有的类的内部逻辑。当然工厂类必须能够被外界调用,创建所需要的产品对象。抽象(Product)产品角色:简单工厂模式所创建的所有
2021-09-28 16:44:22
767
原创 Android 技巧 —— Debug 判断不再用 BuildConfig
解决方案:使用 ApplicationInfo.FLAG_DEBUGGABLE反编译 Debug 包和 Release 包对比看看有没有区别,会发现他们 AndroidManifest.xml 中 application 节点的 android:debuggable 值是不同的。Debug 包值为 true,Release 包值为 false,这是编译自动修改的。所以我们考虑通过 ApplicationInfo 的这个属性去判断是否是 Debug 版本,如下:public class A
2021-09-27 19:22:58
738
1
原创 Fragment管理库:Navigation
前言在以往的Fragment使用中,我们都是使用Fragment的事务进行添加,删除,替换等操作,为了快速开发,我们也会自行封装一个FragmentController。在去年,Google推出了Navigation库,目标是更优雅的管理Fragment。正文首先我们回顾一下Fragment的事务:fragmentManager.beginTransaction().add(xxx).commit();如果是常见的多Tab切换Fragment,我们会在XML中使用FrameLay..
2021-09-26 15:03:07
1017
转载 Jetpack AAC完整解析(五)DataBinding 重新认知!
前面四篇介绍了Jetpack 架构组件中的 基础组件 以及它们的综合应用:Jetpack MVVM 架构模式,到这里已经基本满足标准化开发了。但 Jetpack 架构组件 除了 Lifecycle、LivaData、ViewModel,还有:WorkManager,用于管理后台工作的任务,即使应用退出或重启时。 Paging,分页库,按需加载部分数据。 Startup,用于App启动速度优化的库,但只适用于库开发者, 郭霖这篇有详细介绍。 DataStore,用于替换SharedPreferenc
2021-09-25 23:21:38
110
转载 Jetpack AAC完整解析(四)MVVM - Android架构探索!
前面三篇介绍了Jetpack 架构组件中 最重要 的部分:生命周期组件-Lifecycle、感知生命周期的数据组件-LiveData、视图模型组件-ViewModel。 这篇,就来探索下目前android开发中 最优秀、讨论最多的架构模式—— MVVM 。几个月前,我所在项目完成了 MVVM 的架构改造。这篇在开始写之前,我也阅读了大量MVVM文章。所以,这篇尽量讲清楚 开发架构模式和MVVM的本质,使得有一种 “哦,原来如此” 的豁然开朗。注意,本篇完全 不会提 DataBinding、双向
2021-09-25 22:15:16
325
转载 Jetpack AAC完整解析(三)ViewModel 完全掌握!
上一篇介绍了Jetpack AAC 的数据处理组件 LiveData,它是使得 数据的更新 能以观察者模式 被observer感知,且此感知只发生在活跃生命周期状态。 这篇来介绍与LiveData搭配使用的视图模型组件——ViewModel。注意,如果你对MVVM架构中的VM和本篇的ViewModel都没有一定认识的话,那么就不要将两者进行联想了。目前,你就理解为没有任何关系。后面会有专门篇幅介绍MVVM。一、ViewModel介绍ViewModel是Jetpack AAC的重要组件,同时也
2021-09-25 16:31:08
188
转载 Jetpack AAC完整解析(二)LiveData 完全掌握!
上一篇介绍了Jetpack AAC 的基础组件 Lifecycle,它是用于管理Activity/Fragment的生命周期。这篇来介绍基于Lifecycle的用于处理数据的组件——LiveData。一、LiveData介绍1.1 作用LiveData是Jetpack AAC的重要组件,同时也有一个同名抽象类。LiveData,原意是 活着的数据。 数据还能有生命? 先来看下官方的定义:LiveData 是一种可观察的数据存储器类。与常规的可观察类不同,LiveData 具有生命周期感
2021-09-25 15:17:19
134
转载 Jetpack AAC完整解析(一)Lifecycle 完全掌握!
一、Android Jetpack 介绍1.1 Jetpack是啥官方定义如下:Jetpack 是一个由多个库组成的套件,可帮助开发者遵循最佳做法,减少样板代码并编写可在各种 Android 版本和设备中一致运行的代码,让开发者精力集中编写重要的代码。JetPack更多是一种概念和态度,它是谷歌开发的非Android Framework SDK自带、但同时是Android开发必备的/推荐的SDK/开发规范合集。相当于Google把自己的Android生态重新整理了一番,确立了Androi
2021-09-25 13:33:11
84
原创 volatile使用时机引发思考 Java 内存模型
volatile关键字我们都知道volatile修饰的变量,保证了数据内存的可见性。强迫每个线程在读取volatile修饰的变量值时,需要从主内存中读取。保证数据一经改变,其它线程立即感知。具体什么情况下使用呢?比如我们设置一个开关,在一个线程完成某件事情时,其他所有线程将不再继续执行新任务。具体代码如下不加volatile修饰时是这样的测试结果如上可以看出,虽然开关已经在main线程中关闭,但是,多线程任务中判断并没有停止,持续进行着f(),并没有看到 threa.
2021-09-19 13:00:00
83
原创 StrictMode使用详解
Android平台中(Android 2.3起),新增加了一个新的类,叫StrictMode(android.os.StrictMode)。这个类可以用来帮助开发者改进他们编写的应用,并且提供了各种的策略,这些策略能随时检查和报告开发者开发应用中存在的问题,比如可以监视那些本不应该在主线程中完成的工作或者其他的一些不规范和不友好的代码。StrictMode有多种不同的策略,每一种策略又有不同的规则,当开发者违背某个规则时,每个策略都有不同的方法去显示提醒用户:StrictMode的策略和规...
2021-07-08 15:39:31
656
原创 android之生命周期onSaveInstanceState()状态保存
android生命周期图:各个方法之间的调用关系图 当用户在开启一个新activity时,当前的activity可能在内存中处于停止状态也可能由于新activity需要更多内存而被系统杀掉了,但不论怎样,当用户在新activity上按返回键时,他希望看到的是原先的activity的界面。原先的activity如果是被重新创建,那么它要恢复到用户最后看到它的样子。那么我们怎么做呢?其实也不难,跟据上一节所述,在onPause()或onStop()或onDestyroy()中保存必要的数据就行了。..
2021-06-30 11:54:31
1227
1
转载 Android进程启动流程(App启动)
站在GITYUAN大神的肩膀上学习,用一张神图表示进程基本的启动流程.站在GITYUAN大神的肩膀上学习,用一张神图表示进程基本的启动流程.上图还需对照源码进行查看,简述一下启动流程:<p>在Android系统全貌描述到了Zygote孵化了第一个进程是system_server进程,而且孵化第一个App进程是Launcher,也就是桌面App。<p>当点击桌面App的时候,发起进程就是Launcher所在的进程,启动远程进程,利用Binder发送消息给syste
2021-02-19 14:23:04
547
转载 Looper.loop为什么不会阻塞掉UI线程?
要完全彻底理解这个问题,需要准备以下4方面的知识:Process/Thread,Android Binder IPC,Handler/Looper/MessageQueue消息机制,Linux pipe/epoll机制。总结一下主要有3个疑惑:1.Android中为什么主线程不会因为Looper.loop()里的死循环卡死?2.没看见哪里有相关代码为这个死循环准备了一个新线程去运转?3.Activity的生命周期这些方法这些都是在主线程里执行的吧,那这些生命周期方法是怎么实现在死循环体外能够
2021-02-16 21:40:24
558
转载 onResume中Handler.post(Runnable)为什么获取不到宽高?
一般需求中会出现在Activity启动中需要获取Ui控件相关大小或者在界面绘制完成之后刷新数据,我们都知道在UI绘制完成之后,时机最好,不会阻塞主线程导致卡顿或者UI控件参数获取失败。也许大家使用过或 知道Handler(MainLooper).Post(Runnable)和View.Post(Runnable)都是把Runnable封装成Message再 push到主线程中looper中MessageQueue中,会发现在Activity的生命周期中执行这两种方式效果不同,前者不满足我们的需求,而后者
2021-02-14 22:38:29
407
转载 Android面向切面编程(AOP)
一、简述1、AOP的概念AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。2、项目场景项目开发过程中,可能会有这样的需求,需要我们在方法执行完成后,记录日志(后台开发中比较常见~),或是计算这个方法的执行时间,在不使用AOP的情况下,我们可以在方法最后调用另一个
2021-02-12 22:22:41
278
转载 NestedScrollingParent & NestedScrollingChild
嵌套滚动:NestedScrollingParent和NestedScrollingChild,这两个东西,可能好多人有点陌生,但我们在很多场景下,已经在不识不觉中使用它了,比如说CoordinatorLayout,它是一个NestedScrollingParent,还有RecycleView,它是一个NestedScrollingChild。一个最常见的效果:列表向上滚动,ToolBar收起,反之,当列表向下滚动时,ToolBar随着列表的滚动出现。这个效果,用NestedScrolling来实现,.
2021-02-08 23:23:37
500
原创 Ijkplayer_基于FFmpeg的轻量级视频播放器
https://github.com/Bilibili/ijkplayerAndroidStudio gradle导入allprojects { repositories { jcenter() }}dependencies { # required, enough for most devices. compile 'tv.danmaku.ijk.media:ijkplayer-java:0.8.8' compile 'tv.dan
2021-02-06 00:28:14
1000
转载 PagerAdapter中的NotifyDataSetChanged
我们知道ViewPager设置PagerAdapter之后通过notifyDataSetChanged方法也可以更新ViewPager,那么这是怎么实现的呢?答案是观察者模式。我们来看一下关于notifyDataSetChange()的源码:/** * This method should be called by the application if the data backing this adapter has changed * and associated views should
2021-02-05 17:19:58
395
原创 PagerAdapter的instantiateItem方法的执行次数
之前以为ViewPager每次滑动都会调用instantiateItem,后来做项目时发现有时滑动时并不执行写在instantiateItem中的一些更新操作。于是写了个demo测试一下,代码如下:import java.util.ArrayList;import java.util.List;import android.app.Activity;import android.os.Bundle;import android.support.v4.view.PagerAdapter;
2021-02-04 18:04:07
588
1
转载 Android DiskLruCache解析,硬盘缓存的最佳方案
概述记得在很早之前,我有写过一篇文章Android高效加载大图、多图解决方案,有效避免程序OOM,这篇文章是翻译自Android Doc的,其中防止多图OOM的核心解决思路就是使用LruCache技术。但LruCache只是管理了内存中图片的存储与释放,如果图片从内存中被移除的话,那么又需要从网络上重新加载一次图片,这显然非常耗时。对此,Google又提供了一套硬盘缓存的解决方案:DiskLruCache(非Google官方编写,但获得官方认证)。只可惜,Android Doc中并没有对DiskLruC
2021-02-04 17:23:21
297
原创 Java BIO NIO AIO【IO模式]——记录
参考文章:Java面试常考的 BIO,NIO,AIO 总结除了 AIO 其他的 IO 类型都是同步的,这一点可以从底层IO线程模型解释,推荐一篇文章:《漫话:如何给女朋友解释什么是Linux的五种IO模型?》
2021-02-03 16:45:39
74
转载 视频缓存AndroidVideoCache
今天分享一个开源库 AndroidVideoCache 。这个库主要是做视频缓存管理功能,支持边下边播,离线播放,缓存管理等。用过MediaPlayer的小伙伴都知道,可以支持在线播放和播放本地资源,但是不支持缓存,这样很消耗用户流量,这个时候AndroidVideoCache就派上用场了AndroidVideoCache的用法 1.添加依赖 compile 'com.danikula:videocache:2.7.1' 2.在Application里面创建全局单例 HttpProx...
2021-02-03 00:41:01
1865
原创 Android Service保活
保活Service我们需要做什么:1.在应用被关闭后保活2.在内用占用过大,系统自动释放内存时保活(优先杀死占用较高的Service)3.重启手机后自动开启Service4.手机息屏后不被释放内存5.手动清理内存时保活Android进程的生命周期与大家比较熟悉的Activity生命周期相比,Android进程的生命周期实质更为简单,越核心的东西越简单嘛,Android将一个进程分为五种不同的状态:一、前台进程 Foreground process二、可见进程 Visible
2021-02-02 10:59:10
1568
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人