Dart语言学习——基本语法 配置环境和"hello world" demo 前面已经配置过flutter的环境了,能够在控制台直接使用flutter来创建和编译运行一个flutter项目。其实flutter sdk已经包含了dart sdk,其在fluuter的bin/cache目前下,名叫dart-sdk,在dart-sdk目录下也有一个bin目录,这个bin目录中就有一个dart命令命令,将dart-sd...
Android-gradle plugin agp 大家常说的agp其实就是Android-Gradle-Plugin的缩写,在项目中的配置就是在根目录下的build.gradle文件中的dependencies中配置的classpath “com.android.tools.build:gradle:xxx”,在根目录build.gradle的dependencies中配置好agp后就能在任意module的build.gradle文件中apply Android提供的各种plugin,常见的就有com.android.application和c
Android-gradle ./gradlew xxx:aDebug的执行流程 不管是windows还是linux或者mac os,新建一个Android工程后,都会在根目录创建一个gradlew.bat和gradlew文件,gradlew.bat是给windows系统用的,而gradlew是给linux和mac os用的。查看这两个脚本文件的代码,其实就是执行一些系统命令,可以看gradlew文件的最后一...
Flutter入门——环境配置 SDK配置 首先当然是上Flutter官网,找一篇最快的入门文章看看,选择MacOS系统,[MacOS上搭建Flutter开发环境] 首先临时性地配置一下Flutter的SDK仓库地址 export PUB_HOSTED_URL=https://pub.flutter-io.cn export FLUTTER_STORAGE_BASE_URL=https://storage.fl...
Android图片库-Fresco Fresco特征 Fresco出产于facebook公司,也可以发生facebook公司的Android框架的图片加载库都是使用的Fresco,比如ReactNative。Fresco很明显的特点就是类似于MVC的结构,DraweeView作为View层,是图片的真正渲染层,DraweeHierarchy负责组件维护最终的Drawable对象,相当于是M,而DraweeControl...
Android-Retrofit Retrofit的定位 Retrofit并不是作为一个网络请求库存在的,而是作为一个网络请求适配层,就比如网络请求库如果是jdbc,那么MyBatis就是Retrofit。Retrofit2底层默认使用OkHttp作为其网络请求库,而其本身只是对网络请求过程的一般操作做了封装,例如参数的构建,数据的解析以及线程切换。 Retrofit秉承Restful风格的简洁性,将每...
Android-Okhttp3源码解析 网络库的选择 理论上来说几乎所有的网络库都是基于Socket实现的,在Socket的基础上可以实现各种应用层的通信协议,比http、ftp等。Java实现的网络库理论上来说都可以在Android端上使用,但由于Android这种嵌入式系统的特性,对网络请求库的要求可能会更严格。 HttpUrlConnection和HttpClient在API23之后已经从系统源码中移除...
Android-Paging源码分析 Paging架构 再回头看一眼Paging的架构图可以看到Paing的核心是PagedList,这个PagedList携带着一个DataSource,也即产生数据的工厂,PagedList中还有分页的配置,例如每页多少个数据,距离底部多少个数据时开始自动加载下一页数据,以及设置加载与更新UI的线程等。 从触发机制与数据流向角度看,构建PagedList是在页面初始化或...
Android-Paging 现代App的主流结构 现在的主流App,例如微信QQ、抖音快手、头条新浪微博,又或者是滴滴美团,这些App其实从页面结构形态上只需要分两类,一类是微信QQ、抖音快手和头条微博这些,是典型的Feed流+详情页,Feed流作为详情页的入口,在主页面展示,而详情页中大块是个图文或者视频,下面是转评赞区,评论区一般来说又是个简单的Feed流。详情页中也可能还会有一些其他详情页的入口,比如有一...
Android-ViewModel MVC、MVP、MVVM,谁才是最好的架构模式 四人帮著有经典设计模式23种,是为具体场景而抽象出来的一些解决方案,而MVC、MVP和MVVM不应该被称为设计模式,如果硬要说是设计模式,也是一种更高层面的设计模式,是对整个项目在视图、控制以及逻辑三个层面的切分与相互通信的设计。 一千个人心中有一千个哈姆雷特,同样的,对于MVC、MVP以及MVVP,一千个程序员也有一千种...
Android-LiveData 传统回调方式 回调是一种动态调用方式,也就是调用的地方并不知道调用的代码具体有何作用,只是遵守了一个调用契约,在某种情况下就需要调用布局,最常见的回调就是观察者模式的监听器回调了。 这里所说的调用契约,具体一点其实就是一个接口,而回调的过程就是将这个接口存入调用类或者通过方法参数传入调用栈中,执行到某种情况时,就调用这个接口,因此是面向接口编程的,因此这个接口的实现只有...
Android-RecyclerView原理 用ListView实现一个列表 ListView是最简单的一种列表实现,通过Adapter可将数据转换为视图。以下代码是ListView的一种典型使用方法data class DemoItem(val text:String, val target: Class<*>)override fun onCreate(savedInstanceState: Bundle?)...
Android-Lifecycle原理 Lifecycle的用途 MVP中,Presenter经常需要感知V(Activity/Fragment)的生命周期,在相应的生命周期回调中做一些操作,比如在onDestory取消网络请求等。一般的套路是,在Activity的基类中持有Presenter的基类,重写Activity的生命周期回调方法,并在这些回调中调用Presenter的相应生命周期方法。但有些组件可能传入的参数是A...
Android-Fragment源码分析 Fragment的概念 由于每个页面都要提供一个Activity来展示页面,这样在某些场景下可能太重量级了,比如说频道之间的切换,所以从Android3开始,提供了Fragment。Fragment可以理解成一种更小粒度的Activity,Fragment自己管理着一个contentView,拥有着Activity的生命周期,并且还有自己的一些额外的生命周期。在Activity的视图...
Android-事件分发机制 事件机制 由View的加载一文得知View并不是我们真正看到的控件,而只是指导Canvas绘制的“导演”使用View的measure、layout和draw三个方法,分别确定View的大小、位置以及View的外观样式。由于Canvas只能控制控件最后是啥样的,一般时候,我们使用控件,不仅需要其展示在界面上,经常我们还需要这些控件与用户进行交互,比如点击、滑动、拖拽等等。从View的...
Android-View的加载 setContentView的工作机制 Activity的setContentView方法实现中都直接调用了getWindow().setContentView方法,这里的window实际上是一个PhoneWindow的对象,PhoneWindow在Activity#attach中被new出来,传入了一个window对象,在Activity的启动过程中得知,Activity#a...
Activity-finish过程与result回调 ### 使用方式  通常我们使用Activity的finish方法和onBackPressed方法来结束当前Activity,其中手机按物理back键就是调用的onBackPressed,查看源码可以发现其实onBackPressed也是调用了finish。如果当前Activity是使用startActivityForResult(Intent, int)来打开...
Android-Activty启动过程 开始调用Activity可以调用startActivity来启动另一个Activity,通过调用栈,可追溯到Activity的startActivityForResult方法中。继续向里层跟进,是调用了Instrumentation#execStartActivity方法,里面通过ActivityTaskManager.getService,调用IActivityStackManager的star...
Android-从常量的进一步认识来理解R文件 在C++中,经常用const来表示某个变量是个常量,在kotlin中也是,其他语言有用let来表示常量的,Java中一般用final来表示常量。更一般的,我们经常使用static final来表示,这样其实是为了防止被反射修改值。import java.lang.reflect.Field;public class FinalReflect { private final...