自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

Chuck Chan的专栏

Android App开发

  • 博客(71)
  • 收藏
  • 关注

原创 RxJava源码学习

个人主页:https://chengang.plus/文章将会同步到个人微信公众号:Android部落格1 RxJava使用RxJava是响应式数据流驱动框架,Retrokit提供了对RxJava的支持。1.1 接入在app module的build.gradle中添加依赖:implementation "com.squareup.retrofit2:adapter-rxjava2:2.3.0"implementation "io.reactivex.rxjava2:rxjava:2.0..

2020-08-12 21:03:05 237

原创 Retrofit源码学习

个人主页:https://chengang.plus/文章将会同步到个人微信公众号:Android部落格1 基本使用@Overrideprotected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_retrofit); new Thread(new Runnable() { @O.

2020-08-12 20:56:19 291

原创 Android jni知识点

个人主页:https://chengang.plus/文章将会同步到个人微信公众号:Android部落格1、创建jni环境https://developer.android.com/studio/projects/gradle-external-native-buildshttps://developer.android.com/training/articles/perf-jnihttps://www.jianshu.com/p/127adc130508https://www.jians.

2020-07-01 19:41:10 786

原创 Android项目总结5

个人主页:https://chengang.plus/文章将会同步到个人微信公众号:Android部落格1、项目需求项目整体的需求是Android盒子支持上下左右控制云台摄像头,还要能相对和绝对控制摄像头的位置。相对控制,意思就是按着左方向键不放,摄像头一直往左边转,到最大值为止,反之亦然;绝对控制,意思是每次按一下方向键,就转一个角度就停下来。2、需求实现最终选择通过定制Android kernel层的uvc代码,编译kernel,打包固件,刷机,编写上层App,从上到下打通控制流程。3、.

2020-07-01 19:40:21 493 1

原创 Android项目复盘4

个人主页:https://chengang.plus/文章将会同步到个人微信公众号:Android部落格UVC协议文档网址:https://www.usb.org/documents?search=&type%5B0%5D=55&items_per_page=50主要下载USB Video Class 1_5,关注下载zip包中的UVC 1.5 Class specification.pdf文件,里面有接口相关的解释。Android盒子控制摄像头项目已经差不多4年了,很多知识点.

2020-07-01 19:39:24 304

原创 Android项目复盘3

个人主页:https://chengang.plus/文章将会同步到个人微信公众号:Android部落格3、健康数据记录项目这个项目遇到的主要问题是应用使用时长和使用次数不准确的问题。原因要从应用的业务逻辑以及源码中去查找。一般我们获取应用使用数据详情的方法是:@TargetApi(Build.VERSION_CODES.LOLLIPOP)private ArrayList<AppLaunchInfoBean> getAppLaunchInfoBean(long start, l.

2020-06-16 11:10:14 290

原创 Android项目复盘2

个人主页:https://chengang.plus/文章将会同步到个人微信公众号:Android部落格2、系统数据检查2.1 dex更新我们开发的java代码通过编译生成.class文件,然后通过dx工具生成机器可以识别的dex文件。Android中采用ClassLoader加载dex文件,加载完成之后可以通过反射调用其中的方法,适合那些不依赖文件等资源的业务,而打点恰好比较适合使用dex加载的方式。Android中有PathClassLoader和DexClassLoader ,他们都继.

2020-06-16 11:09:21 175

原创 Android项目复盘1

个人主页:https://chengang.plus/文章将会同步到个人微信公众号:Android部落格1、商城项目1.1 RecyclerView首页加载商品item内存占用过高原因:首页包含了精选,banner,秒杀,热卖列表,但是每一个ViewType没有在RecyclerView中设置各自的类型,导致缓存的时候当做一整ViewHolder缓存,从而整体内存占用过高。尤其底部的热卖列表上拉加载的时候,显得尤为显著。1.1.1 源码追溯RecyclerView.Recycler.

2020-06-16 11:07:37 290

原创 Android RecyclerView源码学习

文章篇幅较长,文末有总结和流程图。个人主页:https://chengang.plus/文章将会同步到个人微信公众号:Android部落格1、用法一个比较简单的用法如下:class AndroidDeepLearnActivity : Activity() { lateinit var dlRecyclerView: RecyclerView lateinit var context: Context## 4、总结 private val images = ar.

2020-06-03 21:00:29 295

原创 flutter InheritedWidget机制

微信公众号:Android部落格,文末有二维码个人网站:chengang.plus1、用法用法示例:class InheritedData extends InheritedWidget { final String data; InheritedData({ this.data, Widget child, }) : super(child: child); static InheritedData of(BuildContext context) { .

2020-05-19 17:44:46 802

原创 flutter setState机制

微信公众号:Android部落格,文末有二维码个人网站:chengang.plus1、定义setState方法只能定义在State类中,执行这个方法之后,能够更新State限定的StatefulWidget及其子Widget树。在StatefulWidget执行createElement方法创建StatefulElement对象的时候,会回调到StatefulWidget的createState方法,也就回到了我们自定义Widget继承StatefulWidget的createState方法,从.

2020-05-19 17:43:40 1029

原创 创建个人网站

微信公众号:Android部落格个人网站:chengang.plus1、方案采用Github Pages + Jekyll的方式。2、安装Jekyll环境2.1 安装Ruby因为网络的原因,Ruby installer安装文件难得下载,下载网址是:https://rubyinstaller.org/downloads/或https://github.com/oneclick/rubyinstaller2/releases2.2 下载RubyGems下载地址是:https://rubyg.

2020-05-15 19:34:13 1051

原创 flutter通信机制-EventChannel

微信公众号:Android部落格个人网站:https://chengang.plus/流程图如下:1、使用方式当原生平台需要向dart发送消息时,需要用到EventChannel。1.1 Android端注册Android平台的注册方式:class MainActivity : FlutterActivity(){ val DATA_RESULT_CHANNEL = "com.yourname.yourname/typeData" override fun on.

2020-05-15 17:09:52 3865

原创 flutter通信机制-MethodChannel

微信公众号:Android部落格流程图如下:1、发送和接收1.1 flutter端发送消息方式是:class InteractUtil { static const platform = const MethodChannel("com.yourname.yourname/method"); factory InteractUtil() => _getInstance(); static InteractUtil get instance .

2020-05-09 19:21:44 7224 1

原创 flutter 绘制过程 系列3-绘制渲染

文章将同步到微信公众号:Android部落格流程图如下:1、预热帧1.1 scheduleWarmUpFramerunApp调用的最后一个方法是scheduleWarmUpFrame,从这里开始渲染之前遍历的widget。packages\flutter\lib\src\scheduler\binding.dart\ScheduleBindingvoid scheduleWa...

2020-05-07 17:42:07 548

原创 flutter 绘制过程 系列2-布局

文章将同步到微信公众号:Android部落格流程图如下:1、处理RootWidget1.1 scheduleAttachRootWidget回到runApp方法:packages\flutter\lib\src\widgets\binding.dartvoid runApp(Widget app) { WidgetsFlutterBinding.ensureInitial...

2020-05-07 17:39:34 695

原创 flutter 绘制过程 系列1-Binding

1、WidgetStatelessWidget和StatefulWidget都继承自Widget。Widget作为虚类,定义了Element createElement()方法,给继承者实现,返回Element对象。具体到StatelessWidget,实现createElement,返回StatelessElement对象。StatelessElement继承自ComponentEleme...

2020-04-30 16:30:50 936

原创 iOS GridView表格视图

微信公众号:Android部落格一、背景电商类应用会有一个九宫格展示分类下的详细信息,如下:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LHjM9OTf-1588140300104)(https://ftp.bmp.ovh/imgs/2020/04/cd5af6bad847d36a.jpg)]基于九宫格的需求,需要有一个九宫格类的View,当超过一页的...

2020-04-29 14:05:34 826

原创 iOS banner轮播

一、背景电商App一般都会存在图片轮播的场景,而iOS没有轮播UI组件,因此需要自定义一个UI组件以适应项目需要。二、框架整体框架是UIScrollView作为父视图,在视图中添加多个子视图,同时设置好子视图的frame,再设置滚动视图的内容宽度,让UISCrollView能够左右滑动。接下来添加一个定时器,按照设定的播放时间间隔重复触发,循环播放子UIView即可。三、定义属性将对外暴...

2020-04-27 20:16:21 1251

原创 flutter基础集锦

View篇有几种视图框架总体来说有两种,Column和Row,前者表示竖直方向,后者表示水平方向。怎么实现类似wrap_content和match_parent的效果Widget parent = Container( width: 360, height: 360, color: Colors.lightGreen, child: Column( mainAxis...

2020-04-09 15:36:37 678

原创 Flutter系统启动过程分析

启动过程分析原图地址是:https://ftp.bmp.ovh/imgs/2020/04/f92a2d6c47bcf3f6.jpg1、 初始化一般的,都有一个入口Activity,这个Activity继承自FlutterActivity。从入口Activity的oncreate方法开始分析,首先调用FlutterMain.startInitialization(this),如果我们自定义...

2020-04-09 15:26:13 1122

原创 Flutter-banner轮播

文章将同步更新到微信公众号:Android部落格问题背景因为最近做商城App,需要用到轮播,发现flutter的控件库里面没有这个控件(当然了,可能是我自己没有找到),于是就决定自己动手做一个banner轮播图片了。框架整体框架就是一个PageView,Indicator指示器,一个定时器。PageView用来展示需要播放的Widget,此处不一定必须限定死要展示Image....

2019-10-25 20:19:18 322

原创 Android-Fresco系列9 图片展示与释放

文章将会被同步至微信公众号:Android部落格先看流程图:一、回到起点起点是AbstractProducerToDataSourceAdapter,因为ImagePipeline的submitFetchRequest最终调用了CloseableProducerToDataSourceAdapter.create方法,发起了整个请求图片到解码图片的流程,而CloseableProduc...

2019-06-10 18:32:33 749

原创 Android-Fresco系列8 读缓存数据

文章将会被同步至微信公众号:Android部落格看流程图:一、读取解码内存缓存1. BitmapMemoryCacheProducer之前加载图片资源的时候有说到过,从缓存取数据,讲的是从内存取,在AbstractDraweeController的submitRequest方法中,先从缓存取数据,getCachedImage方法://PipelineDraweeController...

2019-06-10 16:05:26 424

原创 Android-Fresco系列7 解码数据内存缓存

文章将会被同步至微信公众号:Android部落格一、BitmapMemoryCacheProducer从第三篇文章中可以看到Producer的初始化顺序是BitmapMemoryCacheProducer->DecodeProducer,由此看到解码成功的图片还要经过内存缓存,等于是说光内存缓存就有两份,一份编码的,一份解码的。这边文章讲解码之后的数据缓存。经过DecodePro...

2019-06-10 15:21:17 418

原创 Android-Fresco系列6 图片解码

文章将会被同步至微信公众号:Android部落格先看看流程图:一、MultiplexProducer从EncodedMemoryCacheProducer传递来的数据,来到了 MultiplexProducer.ForwardingConsumer中。1) 初始化回去看看producer初始化的地方看看其中初始化顺序:EncodedCacheKeyMultiplexProduce...

2019-06-06 19:24:58 942 4

原创 Android-Fresco系列5 编码数据内存缓存

文章将会被同步至微信公众号:Android部落格流程图如下:一、EncodedMemoryCacheProducer1) 数据来源从返回的数据流读取数据网络请求返回InputStream,按照常规思维,从这个stream里面读取数据到byte[]再保存就行了,但是sdk里面的处理更好。在NetworkFetchProducer中有数据返回之后,开始新建一个返回数据大小的输出数...

2019-06-06 15:49:30 499

原创 Android-Fresco系列4 磁盘缓存

文章将会被同步至微信公众号:Android部落格先看流程图:一、DiskCacheWriteProducer从NetworkFetchProducer传递过来的数据是EncodedImage类型,里面的未解码数据是CloseableReference类型。1) produceResults定义了一个DiskCacheWriteConsumer用于消费接收到的消息。//DiskCa...

2019-06-06 09:45:39 602

原创 Android-Fresco系列3 Producer

文章将会被同步至微信公众号:Android部落格先看流程图:一、发起请求记得在AbstractDraweeController的submitRequest方法中先获取一个DataSource对象(getDataSource()),然后定义了一个DataSubscriber对象,是以内部类的方式初始化的,最后调用mDataSource.subscribe().1) Controller...

2019-06-06 09:43:56 515

原创 Android-Fresco系列2 加载资源

文章将会被同步至微信公众号:Android部落格流程图如下:一、SimpleDraweeView加载图片val draweeView = findViewById<SimpleDraweeView>(R.id.my_image_view)draweeView.setImageURI("http://ww1.sinaimg.cn/large/610dc034ly1fjaxh...

2019-06-04 20:37:32 391

原创 Android-Fresco系列1 初始化

文章将会被同步至微信公众号:Android部落格先看流程图:一、开始使用在工程的app目录下的build.gradle添加引用:implementation 'com.facebook.fresco:fresco:1.12.0'Application类中的onCreate方法中添加初始化:Fresco.initialize(this)layout xml文件中添加...

2019-06-04 17:58:17 507

原创 Android OKHttp系列7-HttpURLConnection

文章将会被同步至微信公众号:Android部落格Android Http请求一个典型的请求方式是:private fun getContent(url: String): String? { var connection: HttpURLConnection? = null var info: String? = null try { connec...

2019-05-23 11:09:19 461

原创 Android OKHttp系列6-CallServerInterceptor

文章将会被同步至微信公众号:Android部落格概述开始写入request body数据,并读取服务端返回的数据上一篇文章说到有两个Http协议兼容处理请求,因此有两个流程图,基本是相似的处理流程:Http1CodecHttp2Codec1、Http1Codec(1)写请求头@Override public void writeRequestHeaders(Re...

2019-05-20 19:33:54 326

原创 Android OKHttp系列5-ConnectInterceptor

文章将会被同步至微信公众号:Android部落格概述选定连接接口,并开始连接目标流程图如下:1、找RealConnection选择合适的HttpCodec,为什么要选择呢?因为涉及到Http版本的问题,此处需要兼容,先看代码:boolean doExtensiveHealthChecks = !request.method().equals("GET");HttpCodec...

2019-05-17 17:32:25 251

原创 Android OKHttp系列4-CacheInterceptor

概述处理缓存策略流程图如下:(1) 初始化Cache对象在最开始初始化各个拦截器的时候,到CacheInterceptor对象创建的时候初始化了Cache。getResponseWithInterceptorChain();interceptors.add(new CacheInterceptor(client.internalCache()));在开始请求的时候需要初始化C...

2019-05-15 19:35:53 247

原创 Android OKHttp系列3-BridgeInterceptor

概述用来整理请求和响应的数据流程图如下:(1)Request.Builder请求Header被封装在这个Builder类中,针对不同的情况填写不同的Header值。Http Header请求字段列表如下:Header解释示例Accept指定客户端能够接收的内容类型Accept: text/plain, text/htmlAccept-Charset...

2019-05-14 17:19:10 397

原创 Android OKHttp系列2-RetryAndFollowUpInterceptor

概述失败重试以及重定向流程图如下:(1)StreamAllocation在RetryAndFollowUpInterceptor的intercept方法中初始化了一个StreamAllocation对象。StreamAllocation streamAllocation = new StreamAllocation(client.connectionPool(), crea...

2019-05-14 14:26:23 264

原创 Android OKHttp系列1-流程总结

源码地址:https://github.com/square/okhttp1、 调用示例同步方式:new Thread(new Runnable() { @Override public void run() { try { OkHttpClient client = new OkHttpClient(); ...

2019-05-13 15:51:09 162

原创 Android 新版个税计算小demo程序

去年10月份开始个人所得税支持专项扣除和上调了个税起征点,针对该项改变写了一个小demo,在新政策下计算个人所得税扣除,工资所得,然后将每个月的扣除额度和实际所得额度展示。计入如下:直接上源码:package com.chuck.taxcalculatorimport android.app.Activityimport android.os.Bundleimport andr...

2019-04-29 11:39:31 1588

原创 Android SharedPreferences

UsageSharedPreferences preferences = context.getSharedPreferences(NAME, Context.MODE_PRIVATE);preference.edit().putInt(strKey, nValue).apply();//orpreference.edit().putInt(strKey, nValue).commit()...

2019-04-26 16:09:29 363

空空如也

空空如也

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

TA关注的人

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