您的位置:首页 > 移动开发 > Android开发

AndJump --- Android进阶,注解在Activity与Fragment之间传值

2016-07-14 18:28 393 查看
最近在做一个新项目,做了很多改变,用了比较多的新东西,比如dagger2,rxjava等等。
这也有段时间没写博客了。时间稍微空闲了一点,正好花一点时间将最近项目写的一点东西和大家分享一下。
项目架构搭建完之后,发现这个项目用到注解的地方真的挺多的。但是对于注解的理解一直浮于表面,这对把控整个项目的架构来说,无疑是有点危险的。
所以,花了几天的时间去深入了解下注解,分析了一下dagger2,eventbus,ButterKnife等框架对注解的使用,体会颇深。
然后自己也尝试着写了一个注解库,深入学习。


AndJump

这是注解库的名字,取名的意思是:android jump。
顾名思义,这是一个关于android 的跳转的库。

而在androind中跳转表示这什么呢,一般的理解就是activity和fragment之间的跳转,以及传值了。

所以,这个库的作用就是用来进行activity和fragment之间跳转,传值了。


1.跳转方式比较

好了,废话不多说,现在就来进行一下这个库的具体功能的描述

首先是关于activity的跳转,一般我们使用的是如下方式:

Intenti=new Intent(this,MainActivity.class);

startActivity(i);


那么在AndJump中,则是这样的:

@QtInject
public class MainActivity{

}
public class TestActivity{
...
QtMainActivity.getInstance().start(this);

}


咋看之下,你会觉得,你这明显变得麻烦多了啊,原本我只要写两行代码,缩减一下也就是一行代码的。但是按照你这个库来写的话,我还的在两个地方写。简直多此一举。而且,你这个库还用了注解,不知道注解是很消耗性能的么!

诸位别急,咱继续往下看。

2.传值方式的比较

首先,正常的传值方式的话,在activity中我们是这样做的:

public class TestActivity ...{
....
Intenti=new Intent(this,MainActivity.class);
Bundle bundle = new Bundle();
bundle.putInt("int", 1);
bundle.putString("string", "sss");
i.putExtra("Bundle", bundle);
startActivity(i);
}

public class MainActivity{
onCreat(Bundle bundle){
Bundle  b=getIntent().getBundleExtra("Bndle");
int j=bundle.getInt("int",0);
String  s=bundle.getString("string","");
}
}


而在AndJump中,则是这样的:

public class MainActivity extends Activity{
@QtInject
int i;
@QtInject
String s;
onCreate(Bundle bundel){
QtMainActivity.inject(this);
}
}
public class TestActivity extends Activity{
.....
QtMainActivity.getInstance().setI(1).setS("sss").start(this);

}


ok,现在,再来比较一下,我们可以发现,传统的传值方式需要写部分重复的代码(随着传递的数据变多,代码会显得更加麻烦),

作为一个偷懒的程序员,我们可能会写各种各样的XXXUtil来完成这些重复的操作。

但是,不管如何,我们大都是需要手动去传递一个值,同时要手动去接受,这就显得很是麻烦了。

同时,随着这些繁琐的操作变多,整个类也会变得臃肿,而且也容易出错(比如说KEY值写出,当然,一般会写一些常量,这同样也会使类变得复杂,同时我们还要使后面的人也熟悉这些常量,所以一般还会写各种注释,想想就觉得恐怖)

但是在AndJump中,这其中很多问题是不用我们去考虑的,比如我们可以从上面的代码看到,我们在TestActivity中给MainActivity传递了两个数值,但是,在MainActivity中确只是多了一行代码:

QtMainActivity.inject(this);


这一切,显得要简单的多了,同时,一旦我们觉得需要新增一个值或多个值,我们都不需要去手动赋值,我们只需要在你需要传递的值前添加一个注解

@QtInject
Object o;


这样,在携带数据的地方也只要添加几个字符:

QtMainActivity.getInstance().setO(o).start(context);


3.关于效率问题

对于注解库来说,大家可能更关心的是他的运行效率,如果一个库的运行效率带来的价值无法让你觉得可以抵消重复写多余代码的麻烦,那么,这个库,想必是拒绝的。

因为大家都知道,注解,是消耗性能的。这也是很多人为什么不使用注解库的原因。

但是,最近一两年来,我们可以发现,注解库在悄悄地流行起来,比如大家熟悉的dagger2,以及谷歌推出的databinding。

这里面都使用了大量的注解。

这里为什么单单提出这两个库呢,因为,这两个库虽然使用了注解,但是,他们使用的是编译时注解。

也就是说,对于应用运行时的效率影响,是微乎其微的。

当然,如果说影响肯定还是用的,不过,我指的是编译时,如果编译的效率多加了几秒也算的话(这个没具体测过,不过android studio 本来就这样。。。)

闲话说到这,再转到AndJump身上,同样的,AndJump只使用了编译时注解,所以,对于效率的影响,可以说是和dagger2等是差不多的。

而且,AndJump的库,相对于eventbus来说,很小很小,实际的代码应该是不到1kb吧。

所以,如果你觉得这些多余的操作可以省略的话,不妨考虑下andJump吧~~

4.如何使用

随着android studio的深入,大家肯定更习惯compile来关联第三方库了,同样,AndJump也是如此

使用方法:

全局Gradle

classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'  (修改成当前apt版本)

项目gradle:

compile 'com.qt:andjump-api:0.2'
apt  'com.qt:andjump-compiler:0.2'


最后,附上Demo地址,点击下载
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息