- 博客(1898)
- 资源 (224)
- 问答 (1)
- 收藏
- 关注
转载 Flutter 自定义插件基础
BasicMessageChannel:用于传递字符串和半结构化的信息MethodChannel:用于传递方法调用(method invocation)EventChannel: 用于数据流(event streams)的通信MethodChannel总共有3个成员变量在Flutter中会存在多个Channel,一个Channel对象通过name来进行唯一的标识,所以在Channel的命名上一定要独一无二,推荐采用组件名_Channel名 组合来进行命名。
2023-12-12 18:00:20 858
转载 Android APT从入门到实战
APT可以在编译器扫描注解帮我们提前生成类JavaPoet可以帮我们优雅的生成类,再也不用拼接了APT最主要的功能就是可以替代反射的一些功能,避免降低性能APT只会在编译时影响一点点速度,在运行期不会,而反射刚好相反。
2023-11-30 14:13:39 813 1
转载 浅谈 ViewModel 的生命周期控制
以上就是 ViewModel 的生命周期的总结。我们只是通过对主流程的分析研究了它的生命周期的流程,实际上内部还有许多小细节,逻辑也比较简单,我们就不一一说明了。其实,从 Google 的官方文档中,我们也能够得到上面的总结,这里使用了,也就是 Activity 处于前台的时候配置发生变化的情况,而不是处于后台,不知道你之前有没有注意这一点呢?
2023-11-28 15:12:58 641
原创 Android使用AIDL+MemoryFile传递大数据
Android进程间通信经常会使用AIDL,简单方便,但是数据量有限制,超过一定值会报错:E!!!!!可以通过使用AIDL+MemoryFile传递大数据。
2023-11-23 22:53:59 1025
原创 Android MemoryFile 共享内存
网上很多时间比较久的贴子,通过各种反射在A进程获取MemoryFIle来读取共享数据,这种方式并不可取;MemoryFile新版本的封装方式就体现了它的使用方式,Google是希望随时使用随时创建MemoryFile并把文件描述附共享出去这种方式来实现功能的。Android内存映射文件实现1. 什么是内存映射文件内存映射文件是一种将磁盘上的文件映射到内存中的方法。通过内存映射文件,可以将文件的内容直接映射到内存中的一个地址空间,从而可以直接对内存进行读写操作,而无需通过传统的文件IO操作。
2023-11-23 22:41:00 2322
原创 Android 匿名内存深入分析
共享简单的实现方式就是通过mmap同一个文件来实现。但是真实文件的读写速度实在是太慢了,所以利用tmpfs这个虚拟文件系统,创建了一个虚拟文件来读写。同时这块虚拟内存在上面也写到重写了vm_ops。当有进程操作这个虚拟内存的时候会触发缺页错误,接着会去查找Page缓存,由于是第一次所以没有缓存,读取物理内存,同时加入Page缓存,当第二个进程进来的时也触发缺页错误时就能找到Page缓存了,那么他们操作的就是同一块物理内存了。看完之后发现AshMemory是基于Linux的共享内存实现的。做了几点改造。
2023-11-23 22:32:54 1462
转载 Android多进程
经过模块解耦,开辟新的进程,独立的JVM,来达到数据解耦目的。解析:绑定服务端的Service,绑定成功后,将服务端返回的Binder对象转成AIDL接口所属的类型,然后就可以调用AIDL中的方法了,客户端调用远程服务的方法,被调用的方法运行在服务端的Binder线程池中,同时客户端的线程会被挂起,如果服务端方法执行比较耗时,就会导致客户端线程长时间阻塞,导致ANR,客户端的onServiceConnected和onServiceDisconnected方法都在UI线程中。
2023-11-23 22:09:57 606
原创 怎样用AIDL Service 传递复杂数据
1.在客户端新建一个包,命名需要和服务端放置aidl文件的包名相同(我这里是com.example.remoteservice),然后把服务端的Person.java,Pet.java,Person.aidl,Pet.aidl,IPet.aidl复制到这个包下面。大家都知道在Android中通过AIDL可以跨进程调用Service中的数据,网上也有很多实例,但是大部分实例都是关于基本数据类型的远程调用,很少讲到复杂数据的调用,今天我用一个例子来演示一下怎样用AIDL Service 传递复杂数据。
2023-11-23 21:43:55 601
转载 Android跨进程传大图思考及实现——附上原理分析
在文章开头,我们举的例子中:通过Intent去传递一个Bitmap,在执行到Instrumentation#execStartActivity的时候,我们发现Intent有个prepareToLeaveProcess方法,在此方法里面调用了Bundle#setAllowFds(false)上面测试的时候,超出200k数据传递的时候,LogCat已经给我们打印提示“Transaction too large”了,但是只要没有超出异步事务空闲的缓冲区大小,就不会崩溃;先别着急着下结论,继续往下看👇👇。
2023-11-23 16:23:34 221
原创 Android跨进程传图片或者大数据(解决TransactionTooLargeException)
优势效率相对最高传递图片没有大小限制劣势使用相对麻烦,需要自定义aidl相关代码可能有侵入性,必须在四大组件中接收。/***/
2023-11-22 15:29:55 2607 2
原创 Flutter StreamBuilder 实现局部刷新 Widget
当widget需要进行刷新时,我们可以通过调用widget的setState方法来实现,setState随后会调用State的build方法来进行重建。那么,如果 我们能将 build方法中的 return new Text(_text) 暴漏出去,我们就可以实现通用的 局部刷新 Widget。Stream 就是事件流或者管道,是基于事件流驱动设计代码,然后监听订阅事件,并针对事件变换处理响应。Flutter StatefulBuilder 用来实现局部数据刷新。本页面实现 Demo 效果如下。
2023-11-09 15:54:26 953
转载 Flutter:WebSocket封装-实现心跳、重连机制
Http协议是无状态的,只能由客户端主动发起,服务端再被动响应,服务端无法向客户端主动推送内容,并且一旦服务器响应结束,链接就会断开(见注解部分),所以无法进行实时通信。WebSocket协议正是为解决客户端与服务端实时通信而产生的技术,现在已经被主流浏览器支持,所以对于Web开发者来说应该比较熟悉了,Flutter也提供了专门的包来支持WebSocket协议。
2023-11-08 21:43:40 3127
转载 从 Java 字节码到 ASM 实践
AOP(面向切面编程)的概念现在已经应用的非常广泛了,下面是从百度百科上摘抄的一段解释,比较浅显易懂面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。
2023-11-02 18:39:32 159
转载 ASM 库的介绍和使用
如下所示,在 ClassVisitor 中提供了和类结构同名的一些方法,这些方法会对类中相应的部分进行操作,而且是有顺序的:visit [ visitSource ] [ visitOuterClass ] ( visitAnnotation | visitAttribute )* (visitInnerClass | visitField | visitMethod )* visitEnd......该方法是当扫描类时第一个调用的方法,主要用于类声明使用。
2023-11-02 18:32:31 1494
转载 认识 .class 文件的字节码结构
写一个简单的 Demo.java 程序如下所示使用 javac 命令编译 Demo.java 文件生成 Demo.class 文件接着用文本编辑器打开生成的 Demo.class 文件,如下所示可以看到,该文件中是由十六进制符号组成的,这一段十六进制符号组成的长串是遵守 Java 虚拟机规范的魔数(Magic Number):.class 文件的第 1 - 4 个字节,它唯一的作用就是确定这个文件是否是一个能被虚拟机接受的 class 文件,其固定值是:0xCAFEBABE(咖啡宝贝)。
2023-11-02 16:03:15 100
转载 Android 性能优化系列 - 04 Matrix 中 TraceCanary 源码解析
在做 UI 性能优化的时候,很重要的一点就是需要做好优化前和优化后的对比,否则怎么判断自己的优化是否有效果,效果有多大呢?对比的话,个人认为可以分为两类,一类是通过观察直观的对比,另一类是通过数据客观的对比直观对比,我们可以通过开发者选项中的过渡绘制和GPU 分析查看页面中是否存在过渡绘制和 UI 渲染时的 GPU 渲染图客观对比,我们可以通过各种测试工具分析、对比,比如网易的Emmagee、腾讯的matrix。
2023-11-02 13:42:29 287
转载 Android 性能优化系列 - 03 使用对象池优化内存
避免在循环里面或者频繁被调用的方法里面创建对象,在循环或者被频繁调用的方法之外创建对象使用对象池缓存对象,在使用对象的时候,直接从对象池中取对象即可,避免频繁的创建对象一般来讲,实现对象池有三种方法,对应的具体的数据结构即是数组、链表和 Map,下面我将通过示例分别介绍通过这三种数据结构实现的对象池首先是Pool<T>接口定义,代码不难,如下所示,只有两个方法acquire()和方法acquire():从对象池中取一个对象,注意:有可能会返回 null:将一个对象释放到对象池中,
2023-11-02 13:36:11 477
转载 Android 性能优化系列 - 02 理解 systrace
在上篇文章中已经介绍过了,systrace 本质上是对其他工具的封装,包括 PC 端的 atrace 和设备端的 ftrace,ftrace 是 Linux 内核中的主要跟踪机制。systrace 使用 atrace 开启追踪,然后读取 ftrace 的缓存,并且把它重新转换成HTML格式。
2023-11-02 13:27:18 395
转载 Android 性能优化系列 - 01 手把手教你使用 systrace
性能优化是 Android 中的一个重要知识,也是衡量一个 Android 工程师水平的重要依据,简单的性能优化,可能很多人都会。比如以下几个优化 UI 渲染的方法,想必很多人都知道使用“设置 --> 开发者选项 --> 调试 GPU 过度绘制”,根据屏幕显示的不同颜色来区分是存在过度绘制,从而排查该界面的 xml 文件,去除不必要的 background,消除过度绘制通过。
2023-11-02 12:20:25 1618
原创 ContentProvider的执行时机
这里先给出源码分析的结论:ContentProvider 的 onCreate() 方法先于 Application 的 onCreate() 方法执行,晚于Application的onAttachContext()方法执行。
2023-10-23 11:12:01 320
转载 Android中SPI思想应用与改进
在自定义的gradle任务中,遍历所有的二进制文本文件无论是class格式还是jar格式,查找注解标注的类,以../app/build/intermediates/javac/{variant}作为注册表类的存放目录,并仿照JDK中META-INF/services格式,在../app/build/intermediates/spi/debug/services目录下生成遍历生成的KV文件。目前掌握的需求场景有两种:1). 插件场景,调用方定义接口,实现方提供接口实现,将装配的控制权移到调用方模块之外。
2023-10-23 11:00:55 389
原创 Flutter 单线程模型保证UI运行流畅
好了,今天关于 Dart 的异步与并发机制、实现原理的分享就到这里了,我们来简单回顾一下主要内容。Dart 是单线程的,但通过事件循环可以实现异步。而 Future 是异步任务的封装,借助于 await 与 async,我们可以通过事件循环实现非阻塞的同步等待;Isolate 是 Dart 中的多线程,可以实现并发,有自己的事件循环与 Queue,独占资源。Isolate 之间可以通过消息机制进行单向通信,这些传递的消息通过对方的事件循环驱动对方进行异步处理。
2023-07-19 19:56:29 2640 2
转载 一次Binder通信最大可以传输多大的数据?
在第六章中,我通过匿名共享内存的方式解决Binder通信是无法传递大数据的问题,一次Binder通信最大可以传输是1MB-8KB(PS:8k是两个pagesize,一个pagesize是申请物理内存的最小单元)但是这个答案对不对呢,我只能说不准确,接下来我们来仔细研究一下。
2023-04-20 21:38:17 1696
转载 Flutter渲染之Widget、Element 和 RenderObject
上面通过源码讲解了一下 Widget、Element、RenderObject 的联系。下面简单来个总结。我们写好 Widget 树后,Flutter 会在遍历 Widget 树时调用 Widget 里面的 createElement 方法去生成对应节点的 Element 对象,同时 Element 里面也有了对 Widget 的引用。
2023-04-04 12:10:48 1604 1
转载 Android系统启动流程
init进程是Android系统中用户空间的第一个进程(pid=1),它是用户进程的鼻祖,负责孵化各种属性服务、守护进程也包括非常重要的Zygote。init进程是由多个源文件共同组成的,这些文件位于源码目录system/core/init。本文将基于Android7.0源码来分析Init进程。二。
2023-03-27 01:38:01 4707
原创 Android OkHttp面试题汇总
首先来看一个最简单的 Http 请求是如何发送的。复制.build()})这段代码看起来比较简单,OkHttp 请求过程中最少只需要接触 OkHttpClient、Request、Call、 Response,但是框架内部会进行大量的逻辑处理。所有网络请求的逻辑大部分集中在拦截器中,但是在进入拦截器之前还需要依靠分发器来调配请求任务。关于分发器与拦截器,我们在这里先简单介绍下,后续会有更加详细的讲解分发器:内部维护队列与线程池,完成请求调配;拦截器:五大默认拦截器完成整个请求过程。
2023-03-26 00:42:37 2638 2
转载 Android Context 是什么?
至此,一个Android应用可能创建Context的地方基本分析结束。所有有关创建Context对象的地方都是在ActivityThread类中,该类就是整个应用的入口,也是整个应用的主线程。每个应用首先会创建一个Application对象,且一个应用只有唯一一个Application对象,之后再根据需求创建Activity或者Service。且在创建Activity或者Service的时候都会持有一份当前应用的Application对象,通过getApplication方法即可获得。
2023-03-23 21:35:07 2413
转载 看图学会RecyclerView的缓存复用机制
我们继续保持向上滑动的手势,此时,由于下一个待进入屏幕的列表项与position=0的列表项的itemType相同,因此我们可以在走到从mRecyclerPool查找合适的ViewHolder对象这一步时,根据itemType找到对应的ArrayList,再取出其中的1个ViewHolder对象进行复用,即图中的情况①。另外,随着position=1的列表项重新进入屏幕,position=7的列表项也会被移出屏幕,该位置的列表项同样会进入mCachedViews,即RecyclerView是双向缓存的。
2023-03-22 20:02:31 1137
原创 RecycleView相关面试题
四级缓存和流程说一下。滑动10个,再滑回去,bindview可以是19次调用,可以是16次调用。缓存的其实就是缓存item的view,在Recycleview中就是viewholder。cachedView就是mCacheViews缓存区中的view,是不需要重新绑定数据的。本文是本人学习RecyclerView的ViewHolder回收复用的过程记录,仅为自己复习时使用。大家在使用RecyclerView时都会创建自己的Adapter并重写相关的方法。//创建ViewHolder。
2023-03-22 17:05:49 2186
转载 Flutter/Dart的HashMap
总体来说Dart的HashMap和LinkedHashMap实现还是比较简单的,并没有像jdk一样做一些细致的优化工作,这可能有待于Dart/Flutter的进一步发展吧。但我们也能看到不论是何种语言,一些基础的数据结构其设计思想都是相通的。
2023-03-20 00:36:43 1427
转载 HashMap扩容为什么每次都是之前的2倍
HashMap的底层是通过数组+链表+红黑树的数据结构来存放数据的。我们知道,当新添加元素的key值出现了hash碰撞,就会在同一个bucket中形成链表或者红黑树。当键值对的数量超过阈值时就会扩容,将以前处于同一个链表或者红黑树上的元素打散,在新数组的 bucket 上进行重新分布。当HashMap在初始化没有指定容量的情况下,首次添加元素时,数组的容量为16;当超出阈值,数组容量为扩容为之前的2倍。那么问题来了,为什么HashMap会将首次初始化容量设置为16,而后续每次扩容都是之前的2倍?
2023-03-16 22:19:37 1980
转载 dubbo的SPI应用与原理
本篇简单分别介绍了 Java SPI 与 Dubbo SPI 用法,并对 Dubbo SPI 的加载拓展类的过程进行了分析。同时分析了Dubbo AOP的实现原理。如果文章中有错误不妥之处,希望大家指正。举例。
2023-02-28 13:34:17 958
转载 ServiceLoader使用看这一篇就够了
想要实现上面的需求,首先要知道拦阻这个需求实现的问题,然后把这些问题都解决了,需求自然也就实现了。上面说了,正常情况下会那样输出,但是你运行程序你就会发现,马丹,怎么不起作用啊,我哪里做错了,都是按照文章步骤来做的。在ServiceLoader.load的时候,根据传入的接口类,遍历META-INF/services目录下的以该类命名的文件中的所有类,并实例化返回。最简单的方法,把资源下的META-INF文件夹拷贝到build目录下,然后再运行,发现可以了,这也就验证了,确实是这个问题造成的。
2023-02-27 22:54:04 1087
转载 Android 内存缓存框架 LruCache 的实现原理
大家好,我是小彭。在之前的文章里,我们聊到了 LRU 缓存淘汰算法,并且分析 Java 标准库中支持 LUR 算法的数据结构 LinkedHashMap。当时,我们使用 LinkedHashMap 实现了简单的 LRU Demo。今天,我们来分析一个 LRU 的应用案例 —— Android 标准库的 LruCache 内存缓存。
2023-02-27 18:35:24 1764
转载 关于sublime打开文件有.dump后缀的解决方法
当打开一个非utf-8格式且包含汉字的文件时,sublime会自动生成一个dump文件,文件修改过程中,不会修改原文件,只有按"保存"了才会将dump的数据更新到原文件里,关闭当前编辑的dump文件则会自动删除dump文件。中文文件由gbk编码,刚安装的sublime不支持转码, 所以会有GBK Support 插件解决这个问题,但是这个插件不是很好,插件的副作用(.dump文件生成)我们需要换换一个插件 ConvertToUTF8,同样解决这个问题,而且没有副作用,安装方法如下。
2023-02-21 20:58:21 680
转载 BitmapPool 了解吗?Glide 是如何实现 Bitmap 复用的?
以上就是 Glide 中 Bitmap 复用的原理,希望本文对你有所帮助!
2023-02-19 01:08:47 1167
转载 Android Glide源码解析
源码方面主要从最基本的三个方法入手:with,load,into。Glide.with可以看到,每个重载方法内部都首先调用getRetriever()方法获取一个RequestManagerRetriever对象,然后调用其get方法来返回RequestManager。传入getRetriever()的参数都是Context,而RequestManagerRetriever.get()方法传入的参数各不相同,所以生命周期的绑定肯定发生在get方法中。下面,接着分析getRetriever()方法。
2023-02-19 00:17:40 779
转载 Android ANR详解
然后InputDispatcher开始了第一轮的事件分发,此时并没有正在处理的事件,因此InputDispatcher从inBoundQueue队列头部取出事件,并重置ANR的计时,并检查窗口是否就绪,此时窗口准备就绪,将该事件转移到了outBoundQueue队列中,因为应用管道对端连接正常,因此事件从outBoundQueue取出,然后放入了waitQueue队列,因为Socket双向通信已经建立,接下来就是 应用进程 接收到新的事件,然后对其进行分发。
2023-02-18 14:14:03 3129
Android将list数据通过LitePal保存到本地(集合保存到本地)
2016-06-17
AndroidDownLoad-多线程断点续传下载
2016-06-14
DownloadEngine-Android多线程下载断点续传
2016-06-14
android-rsa-http
2016-06-12
RxJava在Android中内存泄漏解决以及RxJava的封装
2016-05-23
Android H5做的商城客户端
2016-04-29
Android通过AsyncTask与ThreadPool(线程池)两种方式异步加载大量数据的分析与对比
2016-03-31
Android Bluetooth蓝牙通信文件传输
2016-03-27
Android蓝牙聊天程序的扩展开发(基于Google Sample,类QQ设计)
2016-03-26
Android蓝牙聊天程序优化版
2016-03-26
Android 通过Socket 和服务器通讯
2016-02-16
android RangeSeekBarView 选定范围值的控件
2016-02-01
Android仿天天动态上拉播放界面控件
2016-01-31
Flutter编程指南-多线程
2022-02-21
java数据结构与算法之美(物超所值)
2022-02-09
flutter_macos_2.8.1-stable.zip
2022-01-05
mac_apktool.zip
2021-03-25
Postman-osx-5.3.2 for Mac
2017-10-31
CoordinatorLayout+AppBarLayout实现上滑隐藏ToolBar
2016-08-19
android自定义进度条渐变色View的实例代码
2016-07-26
Android多行文本折叠展开效果
2016-07-25
Android封装popwindow类(下拉菜单弹出和收缩效果)
2016-07-22
Android自定义spinner下拉框
2016-07-16
Android DigitalClock实现倒计时
2016-07-12
Android 带箭头有光晕效果的ProgressBar
2016-07-04
android webview与 js交互通信
2016-06-20
Android项目webview中做与js交互
2016-06-20
Android客户端提供Socket服务与pc通过USB通信
2016-06-17
Android 使用Socket,ServerSocket编程网络通信
2016-06-17
Android socket即时通信Demo
2016-06-17
自定义view和自定义动画怎么学习比较好呢?
2016-11-16
TA创建的收藏夹 TA关注的收藏夹
TA关注的人