我对androidannotations库的看法

来源:互联网 发布:java调用webapi接口 编辑:程序博客网 时间:2024/06/06 06:40

最近才发现项目的代码中方法数已经有6万多,很吃惊,觉得项目貌似没有那么大,怎么会有那么多的代码量。但是我马上就想到了项目中用了androidannotation库,他会在编译时生成很多的代码。

其实我本人特别讨厌使用这个库,虽然他没用反射,在编译时生成的代码,对效率也许没什么影响,并且感觉少些了一些findViewById,传参数啊,启动Activity啊之类代码。但是,我特别特别讨厌类后面还要加个_ !!!特别特别讨厌在项目中写带_后缀的类 这样看代码时,来回点很麻烦!!!并且如果有关androidannotation的代码写错了,根本找不到错误的地方,stuido会提示所有的带后缀的文件找不到了!!!并且现在如果要在项目中去掉这个库,改动量非常多,就像豆腐里混进了沙子,上了贼船就下不来了。特别讨厌这样被捆绑的感觉。


下面就来详细的分析一下,代码中方法数是怎么变多的。
android studio新建一个项目,MainActivity是这样子的

public class MainActivity extends AppCompatActivity {    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);    }}

然后看一下dex中的方法数为16846

再建一个项目,在gradle中添加androidannotation依赖,MainActivity改为下面这样,其他的不变

@EActivity(R.layout.activity_main)public class MainActivity extends AppCompatActivity {    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);    }}

这时dex中的方法数为17258 方法多了412
方法并没多多少,基本上是androidannotation jar包中多出的方法

所以我反编译了一下项目
空项目的时候,目录是这样的
空项目

而用了androidannotation时,目录是这样的
加入框架
他会在再自动生成一个ManActivity_.java
并且这个类代码还是很多的

public final class MainActivity_extends MainActivityimplements HasViews{    private final OnViewChangedNotifier onViewChangedNotifier_ = new OnViewChangedNotifier();    @Override    public void onCreate(Bundle savedInstanceState) {        OnViewChangedNotifier previousNotifier = OnViewChangedNotifier.replaceNotifier(onViewChangedNotifier_);        init_(savedInstanceState);        super.onCreate(savedInstanceState);        OnViewChangedNotifier.replaceNotifier(previousNotifier);        setContentView(layout.activity_main);    }    private void init_(Bundle savedInstanceState) {    }    @Override    public void setContentView(int layoutResID) {        super.setContentView(layoutResID);        onViewChangedNotifier_.notifyViewChanged(this);    }    @Override    public void setContentView(View view, LayoutParams params) {        super.setContentView(view, params);        onViewChangedNotifier_.notifyViewChanged(this);    }    @Override    public void setContentView(View view) {        super.setContentView(view);        onViewChangedNotifier_.notifyViewChanged(this);    }    public static MainActivity_.IntentBuilder_ intent(Context context) {        return new MainActivity_.IntentBuilder_(context);    }    public static MainActivity_.IntentBuilder_ intent(android.app.Fragment fragment) {        return new MainActivity_.IntentBuilder_(fragment);    }    public static MainActivity_.IntentBuilder_ intent(android.support.v4.app.Fragment supportFragment) {        return new MainActivity_.IntentBuilder_(supportFragment);    }    @Override    public boolean onKeyDown(int keyCode, KeyEvent event) {        if (((SdkVersionHelper.getSdkInt()< 5)&&(keyCode == KeyEvent.KEYCODE_BACK))&&(event.getRepeatCount() == 0)) {            onBackPressed();        }        return super.onKeyDown(keyCode, event);    }    public static class IntentBuilder_ {        private Context context_;        private final Intent intent_;        private android.app.Fragment fragment_;        private android.support.v4.app.Fragment fragmentSupport_;        public IntentBuilder_(Context context) {            context_ = context;            intent_ = new Intent(context, MainActivity_.class);        }        public IntentBuilder_(android.app.Fragment fragment) {            fragment_ = fragment;            context_ = fragment.getActivity();            intent_ = new Intent(context_, MainActivity_.class);        }        public IntentBuilder_(android.support.v4.app.Fragment fragment) {            fragmentSupport_ = fragment;            context_ = fragment.getActivity();            intent_ = new Intent(context_, MainActivity_.class);        }        public Intent get() {            return intent_;        }        public MainActivity_.IntentBuilder_ flags(int flags) {            intent_.setFlags(flags);            return this;        }        public void start() {            context_.startActivity(intent_);        }        public void startForResult(int requestCode) {            if (fragmentSupport_!= null) {                fragmentSupport_.startActivityForResult(intent_, requestCode);            } else {                if (fragment_!= null) {                    fragment_.startActivityForResult(intent_, requestCode);                } else {                    if (context_ instanceof Activity) {                        ((Activity) context_).startActivityForResult(intent_, requestCode);                    } else {                        context_.startActivity(intent_);                    }                }            }        }    }}

这样Activity,Fragment等都会多生成一套代码,随着页面数量的增加,就会导致dex中的类多了很多。


最后,对新开发项目的小伙伴们的建议,不要用androidannotations库,不要用androidannotations库,不要用androidannotations库。当然听不听随你。

0 0
原创粉丝点击