- 博客(67)
- 资源 (4)
- 收藏
- 关注
原创 AndroidStudio配置aar包的依赖方式
创建本地仓库文件夹LocalRepo,文件夹名称可以自定义。在LocalRepo文件夹下为每一个aar单独创建文件夹,如下所示。aar包就放在各自的文件夹下。请注意一个aar文件夹下只能放置一个aar。在需要aar的模块的build.gradle文件中依赖aar。
2024-12-09 10:22:39
675
原创 关于Office阻止访问嵌入对象的解决办法
PS. 个人觉得电脑自带的搜索栏功能不是很好用,有时候依然搜索不出来。所以使用方法1仍无法打开嵌入对象时,可以直接使用Everything等软件搜索对象名称。Word文档中想要下载嵌入的文件时被Office阻止了,无法下载。
2023-11-10 10:23:11
3984
原创 0603-指针和函数
数组名做函数参数,函数的形参会退化为指针。这里的数组名不仅仅指一维数组的数组名,也包括多维数组的数组名,它们作为函数参数时就退化为指针,指针作为函数的返回值时本质是返回函数外部的一段内存空间中的某个地址。地址传递,形参可以改变实参的值。值传递,形参不影响实参的值。
2023-08-21 16:06:48
141
原创 0602-指针和数组
指针的运算符,仅支持“指针与整数的加减运算”、“同类型指针相减”、“两指针比大小”、“逻辑运算符”,其余指针运算都是没有意义的。指针自增或自减的步长只和指针指向的数据类型有关,与实际赋值给指针变量的数据类型无关。2个相同类型的指针相减,得到的结果是2个指针的偏移量。数组作为函数参数时,数组名退化为指针变量,丢失数组长度。指针数组是一个数组,它的每一个元素都是指针类型。保存的地址为起点,偏移i个步长并且取值。1、数组名是常量,指针是变量;指针数组相当于一个二维数组。运行上面代码,结果如下。
2023-06-03 08:53:29
387
原创 0601-指针的基础
数据类型* 变量名其中表示该变量为指针变量,数据类型表示该指针变量保存的是哪一种数据类型的地址,也就是指针变量指向哪一种数据类型。*指针变量此处的为取值运算符。指针变量保存的是内存地址,*指针变量就表示访问该地址对应的内存空间。对*指针变量操作,其实就是读写该内存空间的数据。int a = 10;int * p;p = & a;printf("p指向的数据=%d\n" , * p);printf("变量a的地址:%p\n" , & a);
2023-05-19 16:57:46
726
原创 02-C语言的数据类型
以“0x”或“0X”开头表明该数字是十六进制。如:0xabc、0Xabc、0xABC、0XABC,这四个是同一个数字。所谓的“进制”,其实就是数字的不同格式。字符型变量占用1个字节。当我们写程序要处理一个不可能出现负值的时候,一般用无符号数,这样可以增大数的表达最大值。VS建议采用带_s的函数,如scanf_s、strcpy_s,但这些并不是标准C函数。无符号数:最高位不是符号位,而就是数的一部分,无符号数不可能是负数。:以数字0开始表明该数字是八进制。有符号数:最高位为符号位,0代表正数,1代表负数。
2023-05-11 15:51:28
744
原创 01-C语言介绍
参数可以是cmd命令(如:calc、mspaint等),也可以是应用程序的exe文件的绝对路径(路径分隔符为。return出现在main函数中表示程序结束,出现在其它函数中表示函数结束。C语言仅有32个关键字、9种控制语句、34种运算符即可实现无数的功能。include表示导入,include可以导入任意的文件。utput的缩写,所以stdio表示标准的输入输出库)。:在选中行按F9,或在最左侧鼠标单击,如下所示。main函数是程序的主函数,有且仅有一个。弹出提示,选择语法,点击。表示导入自定义文件。
2023-05-10 09:26:28
628
原创 多线程下巧妙避免空指针
时即使b被置空了,tmpB也不会为空。而且tmpB是一个局部变量,当A.doSomeThings()方法执行完后就释放了,所以不会造成内存泄漏。但是该方法要求A.doSomeThings()不能在短时间内被频繁调用,否则会产生大量的局部变量,这些局部变量又会被一下子回收,造成内存抖动。代码如上,多线程访问A的对象a,为了确保线程安全,常用的方法是加锁。将b赋值给一个局部变量tmpB,在执行B方法前判断tmpB是否为空。上述方法中,将b赋值给一个局部变量tmpB时如果b不空,那么在执行。
2023-03-21 14:53:03
313
原创 Android adb命令获取当前Activity或者Fragment
adb shell “dumpsys window | grep mCurrentFocus”adb shell dumpsys activity your.package.name
2023-01-31 19:17:36
11219
原创 Android Studio gradle.properties和asset下的properties文件 中文取值乱码的解决方案
gradle.properties中文乱码错误配置在gradle.properties增加myName=小明。然后在应用模块的build.gradle中增加resValue "string", "myNameFromProperties", "${myName}"。从如下路径可以看出编译出来的myNameFromProperties是乱码。build/generated/res/resValues/debug/values/gradleResValues.xml正确配置...
2022-05-17 17:31:15
1829
原创 使用LitePal时出现的问题
问题描述PersonRec与FeatureRec是一对多的关系PersonRec personRec = LitePal.where("personId = ?", personId).findFirst(PersonRec.class);这里的personRec查出来是不空的,然后为这条记录更新数据personRec.setPersonInfo(personInfo).save();更新成功了,最后为它增加一条关联记录FeatureRecboolean isFeatureSaved =
2022-04-29 15:26:17
1085
原创 设计接口的心得
从业务本身出发如果业务A与业务B关联很大,但业务A和业务B是可以完全独立存在的业务。这时应该为业务A和业务B分别设计各自的接口。而不应该只提供一个接口将业务A和B绑定在一起。比如
2022-04-15 16:11:54
2496
原创 Android Studio开发项目时SVN的文件过滤项的配置
将下面的过滤规则粘贴至SVN的全局忽略的正则表达式中,点击确定即可。.iml build .idea user.iml local.properties gradlew.bat gradlew build .gradle .o .lo .la .al .libs .git .a .pyc .pyo pycache .rej ~ ## .#* .*.swp .DS_Store [Tt]humbs.db...
2022-03-29 14:49:42
2591
原创 业务流程的异常处理方案
异常处理方案假设正常流程如下:如果步骤2出现异常,那么处理方案一般有以下两种:1、撤销步骤1,当整个流程没有发生过;2、提供补救步骤2.1,然后继续执行步骤3加入补救步骤时,就要考虑如果补救步骤也发生异常时的处理情况。举例车队加油卡充值流程场景1假设银行卡支付成功后,加油卡的充值失败了。这就意味着客户付款了,但是自己的加油卡却没有充到钱。这时候可以有以下两种处理方案方案1撤销银行卡支付,当这次的充值流程没有发生过。方案2提供“补充值”步骤,补充值成功后继续打印票据。并且
2022-01-27 16:51:06
1514
原创 BuildConfig配置参数
配置由函数生成的长整型buildConfigField “String”, “PACK_TIME”, “String.valueOf(${packTime()}l)”
2021-11-09 09:33:06
968
原创 《Jetpack应用指南》笔记
ViewModel持有UI数据Activity/Fragment仅展示数据和处理用户交互。ViewModel持有UI数据。生命周期Activity的重建不会影响ViewModel的生命周期。ViewModel的生命周期函数只有一个onCleared(),当且仅当Activity代表的页面被销毁时才会调用该函数。ViewModel引用ContextViewModel的生命周期长于Activity,所以不应该在ViewModel中持有Activity的引用,否则将引起内存泄漏。ViewMod
2021-07-08 14:16:09
320
原创 谈谈我对“技术服务于业务”的理解
技术服务于业务我觉得这句话应该按逆序来理解,即理解顺序应该是①什么是业务、②怎么服务、③什么是技术。什么是业务业务分为3种:1、满足了什么需求;2、解决了什么问题;3、使用了什么解决方案。...
2021-03-04 14:25:21
2838
1
原创 Java动态代理的理解
动态代理怎么理解要理解动态代理,就要先理解什么是“动态”,什么是“代理”。动态一般情况下如果想实现接口,就直接在代码里面创建一个该接口的实现类即可,然后代码直接运行起来就可以了。这种情况下,在代码运行前接口的实现类就已经通过硬编码的方式编写好了。之所以称为“动态”,是因为接口的实现类并不是事先编写好的,而是在代码运行时生成的。这样的类就叫动态类,而由动态类创建的实例,就叫作动态实例。代理我们往往不会凭空生成动态类,这么做没有意义。通常是为了指定的目标对象创建代理才会这么做,所以才叫动态代理。什
2020-12-23 10:25:54
207
原创 arr的解压与重打包
解压aar将aar解压至tmpDir文件夹在aar所在路径下打开cmd窗口,输入如下命令:unzip ×××.aar -d tmpDir重打包将tmpDir重新打包成一个新的aarjar cvf ×××NewLib.aar -C tmpDir/ .不要漏了末尾的 “.”,“tmpDir/” 与 “.” 之间用空格分隔。×××NewLib.aar表示新aar名称。...
2020-12-11 14:06:47
2559
原创 LockSupport的几点笔记
LockSupport基于一个“许可”的概念来决定线程是否阻塞或是否解锁。当线程调用LockSupport.pack()时先判断是否获取许可,如果已经被分配了许可,就不阻塞当前线程,否则阻塞当前线程,直到其它线程调用LockSupport.unpack()给该线程分配许可。每个线程最多只有1个许可,每个线程的许可各不相同,且互不影响。向一个线程分配许可后,如果该许可没有被消耗掉,那么即使向这个线程释放再多的许可也没有用,因为一个线程最多只能有一个许可。等到最开始的许可被消耗后,如果该线程又调用Loc.
2020-05-21 10:52:37
173
原创 解决办法:某些Windows 10上安装Edge浏览器后无法打开网页
主要问题某些Windows 10上安装Edge浏览器后无法打开网页解决办法找到Edge浏览器的安装目录,将msedge.exe重命名为Chrome.exe。这样一来,网页就可以正常打开了。但是又带来了一些附加的问题。附加问题1、在设置\应用\默认应用中edge浏览器的图标不见了,而且即使设置了edge为默认浏览器,默认打开的还是IE浏览器这是因为原先的可执行文件名虽然改成了Chrom...
2020-03-27 15:19:25
11579
1
原创 认识一下Android中的Window
Window Window是个抽象类,PhoneWindow是Window唯一的实现类。PhoneWindow像是一个工具箱,封装了三种工具:DecorView、WindowManager.LayoutParams、WindowManager。其中DecorView和WindowManager.LayoutParams负责窗口的静态属性,比如窗口的标题、背景、输入法模式、屏幕方向等等。Win...
2019-10-21 23:08:45
987
1
原创 窗口机制的笔记
Activity的生命周期由ActivityThread管控Activity被实例化后最先调用的方法是attach(),在attach()中实例化PhoneWindowActivity.setContentView()最终调用的是PhoneWindow.setContentView()。在PhoneWindow.setContentView()中经历了一下步骤:1、创建DecorView;2...
2019-10-07 07:21:28
488
原创 Android Studio使用WIFI调试应用
先保证电脑和设备(如:手机)连上同一个局域网确保可以执行adb shell输入adb -s 32abe500 tcpip 8888adb connect 设备的当前IP地址当提示connected to 设备的当前IP地址时说明wifi连接已经成功了。如果需要断开wifi连接,则输入adb disconnect即可...
2019-09-26 15:57:44
1040
原创 ActivityRecord、ActivityClientRecord、Activity的关系
在阅读Activity启动流程的源码时遇到了ActivityRecord和ActivityClientRecord,那么它们两个和Activity有什么关系呢?结论 ActivityRecord、ActivityClientRecord、Activity,三者一一对应。分析 ActivityRecord是system_server进程中的对象,ActivityClientRecor...
2019-09-19 23:17:50
6761
1
原创 ActivityRecord、TaskRecord、ActivityStack、ActivityDisplay、ActivityStackSupervisor到底是干嘛的?
最近在阅读Activity启动过程时接触到了这几个概念:ActivityRecord、TaskRecord、ActivityStack、ActivityDisplay、ActivityStackSupervisor。它们是什么,可以用来干什么,以及怎么干的。网络上没有几篇文章可以说明白的,常见的回答就是ActivityStackSupervisor管理ActivityDisplay,Activ...
2019-09-09 22:47:24
3997
10
原创 再看Activity的启动模式
Activity的启动模式:standard、singleTop、singleTask、singleInstance。这四种模式分别是指什么,网上一大堆,就不说了。下面整理下我对这几种启动模式的认识。为什么要设计这么多种启动模式?默认启动模式:standard。每次启动Activity都要创建一个实例,开销太大。为了复用原有的实例,所以又添加了singleTop、singleTask、...
2019-09-09 11:33:34
230
原创 AS导入aar
某个Module依赖一个aar将aar拷贝至该Module的libs目录中在该Module的build.gradle中补上下面的代码repositories { flatDir { dirs 'libs' }}dependencies { compile(name:'XXX', ext:'aar')}多个Module依赖同一个库Modu...
2019-08-26 15:46:24
1206
原创 Intelhaxm安装失败
Android模拟器启动不了了?AS识别不了Genymotion了? 网上对这些问题有各种各样的处理方法,我都试过但是没有用。后来发现,最根本的原因是intelhaxm-android.exe(Hardware Accelerated Execution Manager)没有安装成功。 怎么判断intelhaxm-android.exe是否安装成功呢?可以在cmd窗口中输入sc query...
2019-08-25 23:14:52
11770
原创 在Windows上让Sublime Text支持Cscope
给Sublime Text安装Cscope插件通过 Preference -> Package Control -> Install Package->搜索Cscope插件,并安装。下载 cscope.exe,并配置路径下载cscope.exe的地址:https://download.youkuaiyun.com/download/wangyuexiao/10427148。将csc...
2019-08-15 22:29:56
582
原创 AlertDialog的标题居中,底部按钮为三个时居中布局,更改按钮文字默认大写的设置
标题居中、更改底部按钮默认大写的设置<style name="CustomAlertDialog" parent="@style/Theme.AppCompat.Light.Dialog"> <item name="android:windowTitleStyle">@style/CustomAlertDialogTitle</item> ...
2019-05-23 17:34:12
3543
原创 Android Studio的SVN插件找不到了?
今天开启一个从SVN上checkout下来的项目时发现,Android Studio上svn的插件不见了,可以肯定100%是安装过了的。现在记录下解决的办法:1、点击VCS下的Enable Version Control Integration……2、在弹出来的窗口中选择Subversion,再点击OK即可...
2019-05-08 11:52:30
508
原创 有关线程的笔记
每创建一个线程都要消耗内存,每个线程都有自己的栈空间(大约1M),也就是说每创建一个线程,操作系统就会给该线程分配1M的空间。而且当线程执行完时间片后需要把数据保存至内存或硬盘中,下一个线程执行时又要从内存或硬盘中取出对应自己的数据,这么一存一取也很耗时间。这就是为什么线程开太多的话,会导致执行任务所花费的时间更多的原因。Thread和Runnable不是一对一的关系,而是一对多的关系。比如线...
2019-04-17 23:10:02
322
LockSupportTester.zip
2020-05-21
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人