public static Bean test(String text)
{
Log.d(“test”,text);
return new Bean();
}
}
public class Bean
{
public float field;
public String string;
Object object;
public void setObject(Object object)
{
this.object = object;
}
@Override
public String toString()
{
return super.toString() + “\n” + field + “\n” + object + “\n” + string;
}
}
- 使用
JavaBean
代码还是上面的代码,只不过这次加了点东西,factory
,builder
,new
定义了对象的构造方式,我们还可以用field
和property
标签在对象生成后为对象赋值,通过name
属性指定要赋值给哪个字段或属性,property
所指定的name
应该是一个方法,它的命名应该符合Java
的setter
标准,比如name="abc"
,对应void setAbc(YourType)
方法
- 将
val
转换为var
我知道每次重复写字面值很蠢,所以提供了val
转换为var
的方法,让字面值可以像var
一样被ref
使用
- 完整的
xml
最后在这里提一点无论是factory
还是builder
都不允许返回null
值,默认导入的null
只是为了兼容某些特殊情况而设计的,factory
和builder
返回null
是没有意义的.
6.生命周期和对象所有权
如果说Android
开发中影响范围最广泛的概念是什么,我想那一定就是生命周期了。
因为你会发现几乎什么东西都能跟生命周期扯上关系,在组件创建的时候订阅或请求数据,并一定要记得在组件销毁的时候取消订阅和清理数据,要不然你就等着内存泄漏和迷之报错吧。
还有一个和生命周期有关联的词,那就是对象所有权.
如果Activity
或者Service
引用了Application
的资源,这很合理,因为Application
的生命周期比Activity
要长,不必担心内存泄漏,但如果Application
引用了Activity
的资源,这就有点不合理了,因为Activity
可能随时被杀掉,而Application
的生命周期又比Activity
长,这就容易造成本该在Activity
中释放的资源一直被Application
持有,进而造成内存泄漏,所以Application
不应该有Activity
或者Service
上资源的对象所有权。
所以Liteproj
从一开始就设计成和组件的生命周期绑定在一起,并制定了合理的对象所有权。
Liteproj
支持对5
组件进行依赖注入:
Application
,无特殊要求,会在attachBaseContext
之后与onCreate
之前执行依赖注入Activity
,至少是FragmentActivity
(AppCompatActivity
继承了FragmentActivity
)Service
,需要继承Liteproj
的org.kexie.android.liteproj.LiteService
Fragment
,继承appcompat
的Fragment
即可ViewModel
,需要继承Liteproj
的org.kexie.android.liteproj.LiteViewModel
可以看到Liteproj
的倾入性还是很低的,除了Service
和ViewModel
需要强制继承基类,其他组件的基本上都无需代码改动.
图是用ProcessOn画的:
Service
和Activity
可以使用Application
的xml
配置文件,因为Application
的生命周期比Service
和Activity
都长,同理Fragment
可以使用Activity
的xml
配置文件,而ViewModel
由于不能违背MVVM
的设计原则(ViewModel
不应该知道他是与哪一个View
进行交互的),所以除了自己能使用自己的xml
配置文件之外只允许它使用Application
的xml
配置文件.
在Liteproj
中各种组件的依赖都由DependencyManager
进行管理,可以通过DependencyManager.from(owner)
获得该实例的DependencyManager
.
可以通过DependencyManager#get(String name)
主动获取xml
中定义的依赖,也可以使用隐式装配(下面马上介绍).
当一个依赖的名字在本组件的DependencyManager
找不到的时候,DependencyManager
就会把请求转发到上层的DependencyManager
中,比如在Activity
中找不到某个依赖时,就跑到Application
上去找(但前提是你的Activity
的@Using
注解中引用了Application
的依赖配置文件).
DependencyManager
与组件的生命周期绑定,在组件生命周期结束时,会释放自己占有的所有资源.
7.隐式装配
在继续对比Dagger
和Spring
两者依赖注入的行为中,我发现Spring
有一个Dagger
没有的优点,那就是在依赖注入中的一个设计原则,即一个对象不应该知道自己的依赖是何时
、怎样
被注入的。
为了实现这个功能,我编写了一个ContentProvider
作为框架的初始化器(仿照Android Jetpack Lifecycle
包的做法),ContentProvider
可以在Application
的attachBaseContext
之后与onCreate
之前对框架进行初始化,并对Application
进行依赖注入,自此,Liteproj
终于大功告成.
现在,你只需要使用@Reference
注解,然后填入名字就可以就可以给自己的组件进行依赖注入了,@Reference
注解与xml
中的ref
作用基本一致,但是你将value
留空的时候,它可以使用属性名或字段名进行自动装配.
@Retention(RUNTIME)
@Target({FIELD, METHOD})
public @interface Reference
{
String value() default “”;
}
就好比这样(所有代码都来自Github
的Demo
中):
@Using({R.xml.all_test})
public class MainActivity extends AppCompatActivity
{
private static final String TAG = “MainActivity”;
@Reference(“request”)
Request request;
@Reference(“bean”)
Bean bean;
@Reference(“holder”)
AppHolderTest holderTest;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Logger.d(request + “\n” + bean + “\n” + holderTest.context);
}
}
直接运行你的APP
,就可以看到这些对象居然都被自动设置好了,对的,不需要自定义的Application
类,也不需要你去调用奇怪的init
方法再传入一个Context
实例.
与JSR-330
相比,Liteproj
只有@Using
和@Reference
这两个注解,这样是不是简单多了?
8.发布到jitpack.io
一切代码都编写完成后最后一步当然就是把它发布到在线的maven
仓库了,这里我选择了jitpack.io,因为它实在是太方便了有木有,它与Github
高度集成,发布一个自己的类库甚至都不需要你登录账号.
在根项目的build.gradle
中添加
buildscript {
repositories {
google()
jcenter()
}
dependencies {
classpath ‘com.android.tools.build:gradle:3.2.0’
// ↓↓↓↓↓↓↓↓↓↓↓↓ 加这行! 加这行! ↓↓↓↓↓↓↓↓↓↓↓↓
classpath ‘com.github.dcendents:android-maven-gradle-plugin:2.1’
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
然后继续在你要发布的模块的build.gradle
的头部添加
apply plugin: ‘com.android.library’
//↓↓↓↓↓↓↓↓↓↓↓↓ 加这行! 加这行! ↓↓↓↓↓↓↓↓↓↓↓↓
apply plugin: ‘com.github.dcendents.android-maven’
//↓↓↓↓↓↓↓↓↓↓↓↓ 加这行! 加这行!并且group改成你想要的 ↓↓↓↓↓↓↓↓↓↓↓↓
group=‘org.kexie.android’
然后Look up
在log
中查看编译log
,点击get it
即可开始在jitpack
上编译你的项目
如果成功
allprojects {
repositories {
…
maven { url ‘https://www.jitpack.io’ }
}
}
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级安卓工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年最新Android移动开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Android)
最后
跳槽季整理面试题已经成了我多年的习惯!在这里我和身边一些朋友特意整理了一份快速进阶为Android高级工程师的系统且全面的学习资料。涵盖了Android初级——Android高级架构师进阶必备的一些学习技能。
附上:我们之前因为秋招收集的二十套一二线互联网公司Android面试真题(含BAT、小米、华为、美团、滴滴)和我自己整理Android复习笔记(包含Android基础知识点、Android扩展知识点、Android源码解析、设计模式汇总、Gradle知识点、常见算法题汇总。)
本文在开源项目:【GitHub 】中已收录,里面包含不同方向的自学编程路线、面试题集合/面经、及系列技术文章等,资源持续更新中…
ndroid面试真题(含BAT、小米、华为、美团、滴滴)和我自己整理Android复习笔记(包含Android基础知识点、Android扩展知识点、Android源码解析、设计模式汇总、Gradle知识点、常见算法题汇总。)
[外链图片转存中…(img-eqflxvIi-1710568426142)]
本文在开源项目:【GitHub 】中已收录,里面包含不同方向的自学编程路线、面试题集合/面经、及系列技术文章等,资源持续更新中…