自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 LinearLayout源码详解,移动端开发技术选型

measureVertical(widthMeasureSpec, heightMeasureSpec);} else {measureHorizontal(widthMeasureSpec, heightMeasureSpec);}}在onMeasure中,根据orientation的值来进行纵向的测量或者是横向的测量,纵向和横向测量的逻辑相识,所以我们只需要选取其中一个来进行分析,这里,我们只分析纵向的测量//记录了内部已经被使用的高度mTotalLength = 0;//childVi

2021-11-18 14:02:33 188

原创 LeetCode题解(十)0900-0999,android实现文件下载

return A;}}922. Sort Array By Parity II[Description]Given an array A of non-negative integers, half of the integers in A are odd, and half of the integers are even.Sort the array so that whenever A[i] is odd, i is odd; and whenever A[i] is even, i is

2021-11-18 13:59:33 350

原创 Kotlin协程中的Flow,写给Android开发的小程序布局指南

//catchthrow NullPointerException()}.onStart {Log.e(TAG, "onStart: ")showLoading(“loading…”)}.onCompletion {Log.e(TAG, "onCompletion: ")dismissLoading()}.catch {Log.e(TAG, "catch: ")mBinding.textView.text = “数据出错”}.collect {Log.e(TAG, “coll

2021-11-18 13:57:02 1462

原创 Kotlin 协程学习,databinding原理

print(“World!”)}// 打印结果:Thread name:mainCoroutines Thread name:mainHello, World可以看到 runBlocking{...}开启了一个协程,但是他没有在新线程里面执行,而是一直阻塞到里面的代码块完成。可以来看下下面的用法:fun main() = runBlocking { // 使用runBlocking开启一个协程launch { // 里面再开启一个协程delay(1000L)pr

2021-11-18 13:54:17 792

原创 Koltin40,android性能优化和内存优化

var goodsList: List = ArrayList()fun setDatas(goodsInfoList: List) {this.goodsList = goodsInfoListnotifyDataSetChanged()}inner class GoodsItemHolder(itemView: View) : View.OnClickListener {override fun onClick(v: View?) {TODO(“Not yet implemented”)

2021-11-18 13:51:04 501

原创 Jetpack系列(二) — Lifecycle,请把这些学完再去面试

实现LifecycleObserver创建LifecycleObserver 实现类class MyObserver : LifecycleObserver {@OnLifecycleEvent(Lifecycle.Event.ON_START)fun activityStart() {Log.d("=====", “ACTIVITY START”)}@OnLifecycleEvent(Lifecycle.Event.ON_RESUME)fun connectListener() {L

2021-11-18 13:45:43 967

原创 Jetpack Compose 的Column , Row ,Box 的用法,flutter推送通知

}modifier修饰符。这里先占时不讲,这个是compose很好用而且很重要的知识点,我们会专门写一篇文章介绍修饰符的用法。verticalArrangement 表示是竖直方向上的对齐方式。默认是从顶部开始举个例子,比如Column的高度是200dp,而两个文本控件的高度不足200dp,当设置底部对齐的时候,两个控件会在Column的底部@Preview()@Composablefun columnTest(){Column(// 设置Column的宽度高200dpmodi

2021-11-18 13:42:46 192

原创 Java内存分析,经典Android开发教程

String str = “abc”;两种的形式来创建,第一种是用new()来新建对象的,它会在存放于堆中。每调用一次就会创建一个新的对象。而第二种是先在栈中创建一个对String类的对象引用变量str,然后通过符号引用去字符串常量池 里找有没有"abc",如果没有,则将"abc"存放进字符串常量池 ,并令str指向”abc”,如果已经有”abc” 则直接令str指向“abc”。比较类里面的数值是否相等时,用equals()方法;当测试两个包装类的引用是否指向同一个对象时,用==,下面用例子说明上面的理

2021-11-18 13:40:09 53

原创 Java之JNI初步认识,内含福利

接下来就是写C程序代码了,我们可以看到在生成 的HelloJNI.h头文件中,也声明了我们刚刚在HelloJNI.java里用native 声明的所有函数,我们这里写C代码就必须实现这些头文件中声明了的函数4、在eclipse或vs创建一个C工程,把刚刚生成的HelloJNI.h文件拷贝到工程目录,并导入,接下来再创建一个C程序,根据头文件里的方法声明写方法实现。C代码:#include <stdio.h>#include <stdlib.h>#include “jni.

2021-11-18 13:36:51 2243

原创 Android进阶:七、Retrofit2-0原理解析之最简流程,面试一路绿灯Offer拿到手软

很明显这个方法是在传一些需要的参数,我们简单的跟踪一下:首先看看Builder()的源码:public Builder() {this(Platform.get());}这句代码很简单就是调用了自己的另一个构造函数:Builder(Platform platform) {this.platform = platform;}这个构造函数也很简单,就是一个赋值,我们把之前的Platform.get()点开,看看里面做在什么:private static final Platform PLAT

2021-11-17 17:14:25 251

原创 Android进阶难题:普通公司的程序员跟BAT大公司的技术差距在哪?该如何选择

例如,很多年前就说美国互联网泡沫破灭,但今天互联网经济反而越来越重要了;移动互联网也有人唱衰,“说BAT才掌握船票,已经垄断中国经济,其他公司几乎毫无机会”。却莫名其妙间,又多出了头条、美团、小米、滴滴、京东、拼多多等数不尽的优秀互联网公司。再过十年IT产业会逐渐退潮么,IT人才将会毫无施展才华的土壤么。不得而知,而且也不重要。重要的是,即便在互联网技术飞速发展的今天,中国依然对优秀的IT工程师非常稀缺。即使是在某乎上天天可以看到这种:这种还有这种当然了,还有这种在这种情况

2021-11-17 17:11:48 115

原创 Android进阶系列:八、自定义View之音频抖动动效,android软件开发前景

这样就可以在view中绘制一个矩形,如图所示:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-trYtBNu0-1637140099716)(https://upload-images.jianshu.io/upload_images/14140248-ed1d736aa3661fd6.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)]####绘制多个矩形现在我们可以绘制多个矩形在画布上。直接采用for循环是不

2021-11-17 17:08:36 423

原创 Android进阶——解密笔记,阿里资深Android开发带你搞懂Framework

SystemServer进程主要用于创建系统服务,例如AMS、WMS、和PMS都是由它来创建的。Service进程启动启动Binde线程池,这样就可以与其他进程进行通信。创建SystemServiceManager,用于对系统的服务进行创建、启动生命周期管理。启动各种系统服务(引导服务、核心服务、其他服务)。时序图4. Launcher启动过程Launcher当系统启动到最后一步时,会启动一个应用程序,也就是我们通常看到的应用桌面,它被称作Launcher,在L

2021-11-17 17:05:25 133

原创 Android跨进程通信,rxjava面试题

StreamSocket:基于TCP协议的封装,以流的方式提供数据交互服务,提供了稳定的双向通信,通过“三次握手”建立连接,传输数据具有较高的稳定性。Java中客户端使用Socket类,服务器端使用ServerSocket类。DatagramSocket:基于UDP协议的封装,以数据报文的方式提供数据交互服务,提供了不稳定的单向通信,具有更好的执行效率,由于基于无连接的方式,传输数据不稳定,不保证数据的完整性。Java中使用DatagramPacket类,表示数据报包;DatagramSocket类.

2021-11-17 17:02:05 403

原创 Android设计模式系列—策略模式,flutter弹窗动画

//实现一个接口,打7折商品public class sevenPercentStrategy implements PriceStrategy{public int setPrice(int orgPrice){System.out.println(“打7折商品”);return orgPrice*0.7;}}//实现一个接口,打5折商品public class fivePercentStrategy implements PriceStrategy{public int setP

2021-11-17 16:58:53 280

原创 android设计模式—原型设计模式,【金九银十】

使用场景通过new产生一个对象需要非常繁琐的数据准备或访问权限,这时可以使用原型模式一个对象需要供给其他对象访问,而且各个对象都需要修改其值时,可以拷贝多个对象供调用者访问,即保护性拷贝浅拷贝和深拷贝浅拷贝:使用一个已知实例对新创建实例的成员变量逐个赋值,这个方式被称为浅拷贝。其实指的是使用了同一个内存地址例如:ArrayList a = new ArrayList();ArrayList b = a;/《Android学习笔记总结+最新移动架构视频+大厂安.

2021-11-17 16:56:10 242

原创 Android记录25-WebView实现离线缓存阅读,Flutter中网络图片加载和缓存源码分析

public boolean onJsConfirm(WebView view, String url,String message, JsResult result) {Log.e(TAG, "onJsConfirm " + message);return super.onJsConfirm(view, url, message, result);}@Overridepublic boolean onJsPrompt(WebView view, String url, String messa

2021-11-17 16:53:02 707

原创 Android视图动画-View-Animation,字节跳动安卓开发面试题

使用百分比确定Pivot也很简单,那么Pivot的位置就是:以View的左上角即(0,0)点为基础加上View特定的宽高百分比。<?xml version="1.0" encoding="utf-8"?>示例3:父View百分比Pivot<?xml version="1.0" encoding="utf-8"?>这个计算和上边那个其实是一样的,只是基于的点不同而已,上边是基于自身来算起,那么这个则是基于View的父布局来计算的。那么Pivot的位置就是:以View

2021-11-17 16:50:37 282

原创 Android自定义View之Canvas,Android社招面试题

绘制点//参数表示绘制的点的坐标和画笔Paintcanvas.drawPoint(float x, float y, @NonNull Paint paint);绘制线//参数分别表示线段的起点和终点坐标,以及画笔Paintcanvas.drawLine(float startX, float startY, float stopX, float stopY,@NonNull Paint paint)绘制矩形//参数分别表示四条边距离绘制原点的偏离距离,以及画笔Paintcanvas.dra

2021-11-17 16:47:22 147

原创 Android应用开发Scroller详解及源码浅析

switch (ev.getActionMasked()) {case MotionEvent.ACTION_DOWN:mInitX = ev.getX();mInitY = ev.getY();super.dispatchTouchEvent(ev);return true;case MotionEvent.ACTION_MOVE://>0为手势向右下mOffsetX = ev.getX() - mInitX;mOffsetY = ev.getY() - mInitY;//横向手

2021-11-16 12:39:29 104

原创 Android如何保证一个线程最多只能有一个Looper

if (l != null)throw new RuntimeException(“Only one Looper may be created per thread”);looperRegistry.put(currentThreadId, new Looper(true));}}…}上述方法对Looper.class对象进行了加锁,这些加锁开销有可能造成性能瓶颈。有没有更好的方法实现Looper.prepare()方法?看一看Android的中Looper的源码。public clas

2021-11-16 12:37:45 810

空空如也

空空如也

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

TA关注的人

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