![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
android
Azadoo
这个作者很懒,什么都没留下…
展开
-
主线程可以一直存在的原因
这里就涉及到Linux pipe/epoll机制,简单说就是在主线程的MessageQueue没有消息时,便阻塞在loop的queue.next()中的nativePollOnce()方法里,此时主线程会释放CPU资源进入休眠状态,直到下个消息到达或者有事务发生,通过往pipe管道写端写入数据来唤醒主线程工作。只要线程没有执行完毕或者没有被其它线程杀死,线程就不会进入死亡状态。,可以同时监控多个描述符,当某个描述符就绪(读或写就绪),则立刻通知相应程序进行读或写操作,本质同步I/O,即读写是阻塞的。原创 2023-03-13 10:42:38 · 182 阅读 · 0 评论 -
debug时报anr错:Reason: Input dispatching timed out 解决办法
在排查问题对点击事件的监听debug时,突然遇到这种anr报错 大体意思是点击事件超过5s没有回应 系统报出anr错误并闪退,导致我无法debug查看问题。android Studio 输入下方命令行即可不闪退 正常debug操作。原创 2022-12-02 18:21:18 · 4608 阅读 · 0 评论 -
查看当前Activity或service
adb shell。原创 2022-11-16 16:31:34 · 711 阅读 · 0 评论 -
使用anrwatchdog抓取错误日志
buld.gradle 中引入。原创 2022-10-19 16:21:00 · 559 阅读 · 0 评论 -
抓取特定路径下文件 可批量压缩成压缩包 并分享到微信
【代码】抓取特定路径下文件 可批量压缩成压缩包 并分享到微信。原创 2022-10-19 16:20:02 · 87 阅读 · 0 评论 -
监听多次点击事件
【代码】监听多次点击事件。原创 2022-10-19 16:09:07 · 179 阅读 · 0 评论 -
adb shell命令行
打checkDebug类型包 可以替换成release等其他类型 会在app\build\outputs\apk\路径下。原创 2022-09-05 16:20:03 · 608 阅读 · 0 评论 -
Activity跳转时会闪屏问题解决方案(或打开弹窗底层Activity移动问题)
问题发现途径:页面A需要跳一个透明背景的页面B 发现跳转过程A页面整体会向左移动 并后续会变成纯黑色如上所述问题有两个: 1. A页面移动 2 . A页面呈现黑色导致B的背景不是原A页面原创 2022-08-26 16:34:05 · 2059 阅读 · 0 评论 -
判断textView是否需要展开收起按钮 (超出给定行数)
判断textView是否需要展开收起按钮 (超出给定行数)原创 2022-08-25 18:17:00 · 158 阅读 · 0 评论 -
RecycleView原生滚动进度条ScrollBar
android:fadeScrollbars=”true”(默认参数)是在滑块不滚动时,隐藏。android:fadeScrollbars=”false”是在滑块不滚动时,不隐藏。insideOverlay:默认值,表示在padding区域内并且覆盖在view上。outsideOverlay:表示在padding区域外并且覆盖在view上。outsideInset:表示在padding区域外并且插入在view后面。insideInset:表示在padding区域内并且插入在view后面。...原创 2022-08-25 18:09:57 · 1019 阅读 · 0 评论 -
修改app or avtivity主题
然后再AndroidManifest.xml找到对应的Activity 新增theme属性。首先在values/themes.xml中 写一个透明的style。比如想写一个弹窗 背景是透明的。原创 2022-08-24 16:11:55 · 294 阅读 · 0 评论 -
工具类:展开收起文字
点击展开或文字后 文字全部显示 展开按钮变成收起按钮 点击文字或收起按钮则文字变为两行 显示展开。最多展示两行文字 超出末尾显示省略号 并且在第三行开头展示“展开”按钮。文字不超过两行正常显示 无展开按钮。...原创 2022-08-24 15:57:34 · 416 阅读 · 0 评论 -
<include>标签使用说明
比如你已经写了一个页面A 但是在另一个B页面也需要展示A页面 大致如下图。layout属性后面是对应的A布局的文件名。即可在B页面使用include。原创 2022-08-24 15:49:31 · 397 阅读 · 0 评论 -
实现View点击时与默认显示不同的背景颜色
在需要实现的View直接setBackground该xml。先实现一个xml 在这里声明点击态背景与默认背景。原创 2022-08-17 11:41:21 · 370 阅读 · 0 评论 -
FragmentTransaction replace与show hide实现Tab分页
常规的tab分页是通过Tablayout + ViewPager2实现但是Tablayout 继承 HorizontalScrollView 只能实现横向布局在垂直tab 并且需求简单的场景下 就可以使用FragmentTransaction左侧tab采用两个linearLayout实现 点击则可进行fragment切换...原创 2022-08-10 17:46:15 · 405 阅读 · 0 评论 -
自定义recycleView的删除&移动的动画
坏消息是内部没有能直接提供调用开始移动动画或删除动画的方法有的是runPendingAnimations()该方法内部设置了各个动画的执行实际我们重写这个方法几乎等同于需要重写整个类。但是recycleView默认的是删除动画执行完之后才去执行移动动画这种情况下思路1就无法达到预期只能重写SimpleItemAnimator了。简单的场景下思路1是可以达到预期效果的,但是个人在项目中遇到了另一个难题,ui给的动画需要在执行删除动画的同时下方列表要同时上移。...原创 2022-07-25 18:07:15 · 1586 阅读 · 0 评论 -
xml编写补间动画 PopupWindow实现出现退出的动画
alpha、scale、translate、rotate、set的xml属性及用法PopupWindow实现出场退场动画原创 2022-07-21 10:25:17 · 437 阅读 · 0 评论 -
Jetpack Compose ExoPlayer教程
Jetpack Compose 教程转载 2022-07-01 16:22:45 · 553 阅读 · 0 评论 -
kotlin快速上手
val + 变量名:final类型对象var + 变量名:普通对象声明并初始化:val + 变量名 = 类()val mLintPaint = Paint()定义变量时,可在类型后面加一个问号?,表示该变量是Nullable,不加表示该变量不可为null。如下:var s:String? = nullvar s2:String = “xxx” //如果该变量被赋值为null,则编译不通过声明数组:var long_array:LongArray = longArrayOf(1, 2, 3)var原创 2022-06-21 13:50:22 · 745 阅读 · 0 评论 -
自定义view绘制折线图(支持缩放)
自定义view绘制折线图(支持缩放)原创 2022-06-20 10:12:19 · 663 阅读 · 0 评论 -
Activity、view、window之间的关系
Activity是ui的框架 View是展示出来的视图 而view有多个 window主要是管理 View 的创建与删除,以及与 ViewRootImpl 的交互,将 Activity 与 View 解耦。1,如何理解Activity,View,Window三者之间的关系?先来个算是比较恰当的比喻来形容下它们的关系吧。Activity像一个工匠(控制单元),Window像窗户(承载模型),View像窗花(显示视图)LayoutInflater像剪刀,Xml配置像窗花图纸。1:Activity构造的时.原创 2022-04-17 23:07:25 · 3620 阅读 · 0 评论 -
Context的应用场景与总结
Context是Applycation、service、Activity的父类show a Dialog 方法需要依靠windows才能展现 而只有activity有windows原创 2022-04-17 22:39:49 · 153 阅读 · 0 评论 -
android常用的锁 AtomicInteger lock
AtomicInteger是一种乐观锁——非阻塞同步/** * Atomically increments by one the current value. * * @return the updated value */ public final int incrementAndGet() { for (;;) { int current = get(); int next = curren原创 2022-04-17 22:35:01 · 2595 阅读 · 0 评论 -
lopper ThreadLocal handler造成内存泄漏的原因
首先looper.prepare()方法会判断是否只有一个looper 如果有多个会报错 ,然后构建出一个looper怎么保证一个线程只持有一个looper?每个Thread对象持有一个ThreadLocalMap对象(很像hashMap) 再看上面sThreadLocal.set方法直接获取ThreadLocalMap对象 进行存放 key是线程 value是looper。这也解释了上面通过sThreadLocal.get()方法去进行是否looper已存在的判断。looper.loop方法原创 2022-04-05 15:29:05 · 2289 阅读 · 0 评论 -
Android的主线程可以一直存在的原因
线程是一个动态执行的过程,从产生到死亡包括五个状态:新建、就绪、运行、死亡和堵塞。只要线程没有执行完毕或者没有被其它线程杀死,线程就不会进入死亡状态。Android中的主线程一直存在是因为主线程中一直在监听消息(通过死循环looper.loop一直获取消息),从而使线程无法被执行完毕。问:这个死循环为什么不会导致,主线程阻塞或者几秒无响应发生ANR?这里就涉及到Linux pipe/epoll机制,简单说就是在主线程的MessageQueue没有消息时,便阻塞在loop的queue.next()中的na原创 2023-03-13 10:45:13 · 1103 阅读 · 0 评论 -
View的绘制流程
View 绘制中主要流程分为measure,layout, draw 三个阶段。measure :根据父 view 传递的 MeasureSpec 进行计算大小 主要是宽高。layout :根据 measure 子 View 所得到的布局大小和布局参数(子布局相对于父布局的上下左右点坐标),将子View放在合适的位置上。draw :把 View 对象绘制到屏幕上。...原创 2022-04-03 21:24:05 · 86 阅读 · 0 评论 -
为什么不能在子线程中直接更新ui
首先在子线程中是可以直接更新ui的@Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); init(); new Thread(new Runnable() { @Override public void run() {原创 2022-04-03 20:42:56 · 3706 阅读 · 0 评论 -
多仓库开发 拉取不同仓库分支的时间不一致 导致缺少相关代码的解决措施
基于最早创建的开发分支在本地创建其他仓库的分支 然后使用git push --set-upstream + 分支名的方式将本地分支push到远端 这样你所有的分支及都是基于最早分支拉取的 不会有编译问题原创 2022-03-29 15:09:12 · 122 阅读 · 0 评论 -
打堆栈log
LogUtils.e("title", Log.getStackTraceString(new Throwable()));原创 2022-03-24 14:35:51 · 461 阅读 · 0 评论 -
通过SystemClock限制短时间内重复触发事件
SystemClock:系统计时的,单位毫秒。 private long lastonclickTime=0;//全局变量 long time=SystemClock.uptimeMillis();//局部变量 if (time-lastonclickTime<=10000) { }else { lastonclickTime=time;原创 2022-03-24 14:25:15 · 107 阅读 · 0 评论 -
context.getApplicationContext()与context的差别
getApplicationContext() 返回应用的上下文,生命周期是整个应用,应用摧毁它才摧毁Activity.this的context 返回当前activity的上下文,属于activity ,activity 摧毁他就摧毁原创 2022-03-22 20:16:20 · 367 阅读 · 0 评论 -
HorizontalScrollView横向滑动视图 & ViewFlipper翻转视图
HorizontalScrollView是FrameLayout的子类,这意味着你只能在它下面放置一个子控件,这个子控件可以包含很多数据内容。有可能这个子控件本身就是一个布局控件,可以包含非常多的其他用来展示数据的控件。这个布局控件一般使用的是一个水平布局的LinearLayout 。实际效果是一个可滑动的view 适用于频道切换下方选中标识(结合viewPager做频道切换效果)ViewFlipperViewFlipper是Android自带的一个多页面管理控件且可以自动播放!它和ViewPage原创 2022-03-10 14:48:39 · 1997 阅读 · 0 评论 -
git 生成patch和导入patch
git 生成patch和导入patch当有别人发你的patch文件时 使用 git apply 文件路径 导入patch文件转载 2022-02-18 17:31:41 · 907 阅读 · 0 评论 -
Calling startActivity() from outside of an Activity context requires the FLAG_ACTIVITY_NEW_TASK
安卓跳转失败 查日志SchemeU 显示Calling startActivity() from outside of an Activity context requires the FLAG_ACTIVITY_NEW_TASK flag.解决方法1. 如果使用intent跳转Context中有一个startActivity方法,Activity继承自Context,重载了startActivity方法。如果使用Activity的startActivity方法,不会有任何限制,而如果使用Conte原创 2022-01-12 20:28:05 · 2438 阅读 · 0 评论 -
运行时权限 案例——实现按键获取电话权限并拨打电话
运行时权限ContentProvider会使用到运行时权限的功能运行时权限是安卓6.0添加的功能 用于避免app厂商强迫用户开启其所要的权限 (不给权限就不让安装)比如说一款相机软件在运行时申请地理位置权限 就算我拒绝给这个权限 我仍然可以使用这个app的其他功能 而不是像之前一样不能安装并不是所有权限都需要在运行时申请 否则不停的授权也很麻烦 android将权限归成了两类 一类是普通权限 一类是危险权限 普通权限指哪些不会直接威胁到用户的安全和隐私的权限 系统会自动授权不需要用户手动操作 危险权原创 2021-11-15 15:52:05 · 2063 阅读 · 0 评论 -
安卓四大组件之一——内容提供器ContentProvider
ContentProvider主要用于在不同的应用程序之间实现数据共享的功能他提供了一套完整的机制 允许一个程序访问另一个程序中的数据 同时还能保证被访数据的安全性目前 使用ContentProvider是安卓实现跨程序共享数据的标准方式不同于前面说的文件存储这种全局可读写操作模式 ContentProvider可以选择只对哪一部分数据进行共享 从而保证我们程序中的隐藏数据不会有泄漏风险运行时权限ContentProvider会使用到运行时权限的功能运行时权限是安卓6.0添加的功能 用于避免ap原创 2021-11-12 19:30:21 · 2663 阅读 · 0 评论 -
android 懒加载 ——ViewStub
使用场景当一块布局 有时候不需要展现 有时候需要展现 或者根据不同场景需要展现不同样式通常的解决方案就是:就是把可能用到的View先写在布局里,再初始化其可见性都设为View.GONE,然后在代码中根据数据动态的更改它的可见性。虽然这样的实现,逻辑简单而且控制起来比较灵活;但是也存在一定的缺点耗费资源。因为即使把View的初始可见View.GONE但是在Inflate布局的时候View仍然会被Inflate,故而:(1)仍然会创建对象;(2)仍然会被实例化;(3)仍然会被设置属性从而导致耗费内原创 2021-11-02 16:31:48 · 1502 阅读 · 0 评论 -
SimpleDraweeView——Fresco简单的使用 更方便使用图片如任意方向的圆角 设置加载图 加载失败图片
Fresco中文说明:http://www.fresco-cn.org/Fresco项目GitHub地址:https://github.com/facebook/fresco简介:点击此处注意事项:在xml设置圆角有可能会不生效 此时在代码中声明能够生效问题所在: xml中的Fresco命名空间不对比如我使用xmlns:fresco="http://schemas.android.com/tools"则用的是工具类 读取不到导致圆角不生效 可以直接删除该工具类 或者将其设置为"http://sc原创 2021-10-27 15:36:15 · 397 阅读 · 0 评论 -
相对布局修改不生效或者效果离谱的情况解决方法
比如 现在存在布局A 和布局B 我想让布局B放在布局A上 在布局B中使用above属性 但是不生效 或者B在顶部 而不是紧挨着A首先验证 xml中是否先定义布局A 再定义的布局B 如果颠倒的话 在B中使用above 会找不到A的id如果没有问题 要确定在代码中 有没有对布局A .setLayoutResource(R.layout.布局文件) 如果set了其他资源 那么对其本身的相当于被替换了 id就无法被找到。解决方法: 定义一个空view 位置与布局A一致 让布局B above这个空View 实现原创 2021-10-26 19:02:17 · 308 阅读 · 0 评论 -
Android 动态改变布局属性RelativeLayout.LayoutParams
我们知道,在 RelativeLayout 布局中有很多特殊的属性,通常在载入布局之前,在相关的xml文件中进行静态设置即可。但是,在有些情况下,我们需要动态设置布局的属性,在不同的条件下设置不同的布局排列方式,这时候就需要用到 RelativeLayout.LayoutParams.addRule() 方法,该方法有两种重载方式:首先初始化: RelativeLayout.LayoutParams lp = (RelativeLayout.LayoutParams) mBottomLayout.ge原创 2021-10-26 16:08:04 · 1110 阅读 · 0 评论