Android Annotation框架初步实践
实现模拟访问服务器数据和获取验证码倒计时的功能
关于集成别的文章里都有很多,这里就不说了
集成Android Annotation可以参考链接:
http://blog.youkuaiyun.com/caiwenfeng_for_23/article/details/45801151
,记录下集成失败的解决方案,在module的build gradle中加入
apt {
arguments {
androidManifestFile variant.outputs[0]?.processResources?.manifestFile
}
}
集成好以后,新建一个Activity,注意在Manifest中默认注册的Activity名称上加上”_”,因为Android Annotation会默认生成一个你新建的Activity的子类.如果提示找不到没有关系,编译以后就不会报错了
在Activity上加上
@EActivity(R.layout.activity_main)
可以为Activity注册布局文件.自动生成的onCreate方法可以删掉.
@ViewById(R.id.annotation_test)
TextView getData;
@ViewById
Button getvalid;
如果View的id与变量名一直,可以省略@ViewById后面的参数,如果名称不一致,则需要传入id,如@ViewById(R.id.getvalid)
接下来我们实现一个模拟获取服务器数据的功能:
@Click
public void getuser() {
searchAsync("fancy", "xty");
}
@Background(id="main")
void searchAsync(String searchString, String userId) {
User user = model.getUser(searchString, userId);
upadateUser(user);
}
@UiThread
void upadateUser(User user) {
if(user != null)
getData.setText(user.getUsername() + "," + user.getPassword());
}
在@Background中可以执行被添加@UiThread注解的方法.
被添加了@UiThread注解的方法和未被添加@UiThread注解的方法会在不同的线程执行.
上述代码中model.getUser方法实现的是一个耗时操作,并且在结束后返回一个新的User对象.
在实际项目中,可以把model.getUser替换成访问服务器数据的代码.如果使用http访问服务器,Annotation提供了@Rest来方便开发者实现.
如果使用webService访问服务器,可以自己封装好访问服务器的方法,在model层或者service层调用.
Android Annotation中的 @UiThread 和 @Background 结合使用可以替代异步任务或者部分Handler实现的逻辑.接下来我们用这个框架来实现一个获取验证码倒计时的功能:
int time = 10;
/**按钮的点击事件*/
@Click
public void getvalid() {
getvalidAsync();
getvalid.setEnabled(false);
}
/**倒计时操作*/
@Background(id="getvalid")
void getvalidAsync() {
if (time >= 0) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
time--;
updatebtntext();
}
}
/**实时更新ui*/
@UiThread
void updatebtntext() {
if (time >= 0) {
getvalid.setText(time + "s");
getvalidAsync();
} else {
getvalid.setText("重新获取");
getvalid.setEnabled(true);
time = 10;
}
}
测试,反复重新获取验证码不会出现倒计时越来越快的情况.AndroidAnnotation内部通过BackgroundExecutor 来对线程进行管理,这些我们都不必操心,只需要使用即可.
更多详细的功能使用,请参考博客:http://www.csdn123.com/html/topnews201408/29/729.htm
需要源码的,在评论回复邮箱即可.