在当下的java的使用中,annotations已经被广泛运用,来提升开发效率。在android中,主要是帮助开发者处理一些前后台任务、rest 服务、应用类、代码片段等,让开发者专注于真正重要的东西。
(一)如何使用android annotations
具体使用方法请参看此文。
(二)使用范例
- /**
- * android annotations范例
- *
- * @author peter_wang
- * @create-time 2014-9-13 下午7:40:56
- */
- // 设置Activity的layout布局文件
- @EActivity(R.layout.activity_http_request)
- public class HttpRequestActivity
- extends Activity {
- // 等同findviewById,名字默认是id名字
- @ViewById
- TextView tv_response_main;
- //string资源文件信息
- @StringRes(R.string.hello_world)
- String mHelloWorld;
- // 执行完oncreate后的动作
- @AfterViews
- void init() {
- tv_response_main.setText(mHelloWorld);
- }
- // 点击事件,tv_response_main代表点击的触发View对象id
- @Click
- void tv_response_mainClicked() {
- getHttpData();
- }
- // 后台执行线程
- @Background
- void getHttpData() {
- try {
- // 得到HttpClient对象
- HttpClient getClient = new DefaultHttpClient();
- // 得到HttpGet对象
- HttpGet request = new HttpGet("http://192.168.140.1:8080/SimpleServer/servlet/PayServlet?id=1");
- // 客户端使用GET方式执行请教,获得服务器端的回应response
- HttpResponse response = getClient.execute(request);
- // 判断请求是否成功
- if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
- // 获得输入流
- InputStreamReader inStrem = new InputStreamReader(response.getEntity().getContent());
- BufferedReader br = new BufferedReader(inStrem);
- StringBuilder sb = new StringBuilder();
- String readLine = null;
- while ((readLine = br.readLine()) != null) {
- sb.append(readLine);
- }
- setHttpDataUI(sb.toString());
- // 关闭输入流
- inStrem.close();
- }
- else {
- }
- }
- catch (Exception e) {
- e.printStackTrace();
- }
- }
- // 线程中更新UI
- @UiThread
- void setHttpDataUI(String data) {
- tv_response_main.setText(data);
- }
- }
(三)工作原理
android annotations源于java annotations,简单了解java annotations可以看这篇文章。
java annotations中包含三种类型:SourceCode、Class、Runtime。
android annotations是SourceCode类型,利用Java Annotation Processing Tool (APT) 在编译源文件(*.java)之前,通过注解处理器(AnnotationProcessor)解释并处理源文件中的注解,生成 一些新的源文件,APT也会对新生成源文件进行编译,直到没有新的文件生成。新生成的源文件在apt_generated文件夹中。
编译前
- package com.some.company;
- @EActivity
- public class MyActivity extends Activity {
- // ...
- }
编译后
- package com.some.company;
- public final class MyActivity_ extends MyActivity {
- // ...
- }
(四)优点
(1)简化开发,提高效率。依赖注入layout、views、resource、service等常用操作。
(2)开放。生成的源文件可见。
(3)不影响性能。因为不是runtime操作,都在编译期生成新的源文件,对程序运行速度没有影响。