利用工作之外的时间终于看完了xutils3的所有模块的源码,以此博客来记录自己的分析过程,在此约定半年之后重新分析xUtils3源码对比该系列博客看看自己有没有新的突破。
1. xUtils3源码解析之—–image
2. xUtils3源码解析之—–Http(s)
3. xUtils3源码分析之—–DB(ORM)
4. xUtils3源码分析之—–view注解
基本使用方法
1.初始化xUtils3;
x.Ext.init(this);
2.Activity或者fragment里面注入
public class BaseActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
x.view().inject(this); // 注入
}
}
3.在具体的类里面设置布局文件,ViewInject注解得到布局里的view,Event注解设置view的事件
@ContentView(R.layout.activity_main) // 设置布局文件
public class MainActivity extends BaseActivity {
@ViewInject(R.id.container) // 设置viewId
private ViewPager mViewPager;
@ViewInject(R.id.toolbar)
private Toolbar toolbar;
@Event(R.id.btn_test_db) // 通过viewId绑定默认的点击事件
private void onTestDbClick(View view) {
}
}
view注解源码解析
初始化xUtils3都做了些什么工作?
x.Ext.init(this); // Ext是x类的内部静态类
通过调用x类里面的一个静态Ext类的init(Application app)方法,然后该方法里调用TaskControllerImpl的静态方法registerIntance(), registerIntance方法里双重校验锁实例化TaskControllerImpl, 最后调用Ext.setTaskController(instance)把TaskControllerImpl对象保存到Ext静态类里;
public static void init(Application app) {
TaskControllerImpl.registerInstance();
if (Ext.app == null) {
Ext.app = app;
}
}
org.xutils.common.task.TaskControllerImpl类:
public static void registerInstance() {
if (instance == null) {
synchronized (TaskController.class) {
if (instance == null) {
instance = new TaskControllerImpl();
}
}
}
x.Ext.setTaskController(instance);
}
在activity里面使用view注入源码解析
1.在某个activity里面注入, x.view()方法如果静态类Ext的viewInjector为空,则通过ViewInjectorImpl的静态方法registerInstance创建一个ViewInjectorImpl实例并保存到Ext静态类里跟上面一样的套路;
x.view().inject(this);
public static ViewInjector view() {
if (Ext.viewInjector == null) {
ViewInjectorImpl.registerInstance();
}
return Ext.viewInjector;
}
org.xutils.view.ViewInjectorImpl类:
public static void registerInstance() {
if (instance == null) {
synchronized (lock) {
if (instance == null) {