AndroidAnnotations(Code Diet)android快速開發框架


最近用了一款很不錯的android快速開發框架,1000行的代碼瞬間變成幾百行,不用你會后悔的

特點:

(1) 依賴注入:包括view,extras,系統服務,資源等等
(2) 簡單的線程模型,通過annotation表示方法運行在ui線程還是后台線程
(3) 事件綁定:通過annotation表示view的響應事件,不用在寫內部類
(4) REST客戶端:定義客戶端接口,自動生成REST請求的實現
(5) 沒有你想象的復雜:AndroidAnnotations只是在在編譯時生成相應子類
(6) 不影響應用性能:僅50kb,在編譯時完成,不會對運行時有性能影響。
PS:與roboguice的比較:roboguice通過運行時讀取annotations進行反射,所以可能影響應用性能,而AndroidAnnotations在編譯時生成子類,所以對性能沒有影響

現在我們開始試用這個吧

  • 首先我們要准備一下基本環境

1.因為目前主流市場IDE環境轉入android studio,所以我就直說它的搭建環境吧,打開build.gradle(project)文件導入我們需要的編譯環境,下載編譯環境工具包

// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:1.1.+' 
        classpath 'com.neenbedankt.gradle.plugins:android-apt:1.4'   //導入編譯AndroidAnnotations框架需要使用的工具包
    }
}
tasks.withType(JavaCompile) {
    options.encoding = "UTF-8"
}
allprojects {
    repositories {
        jcenter()                                            //下載jcenter服務器上的插件工具包
    }
}

2.打開build.gradle(Module)文件導入我們需要的編譯環境,導入下載的工具包apt,下載框架需要的包,然后在運行之前編譯的配置,並且輸出日志

apply plugin: 'android'
apply plugin: 'android-apt'                                 //導入下載的工具

dependencies {
    compile fileTree(include: '*.jar', dir: 'libs')
    compile project(':SwitchCompatLibrary')
    compile 'com.orhanobut:logger:1.1+'
    compile 'org.androidannotations:androidannotations:3.3.1'          //導入框架包
    apt 'org.androidannotations:androidannotations:3.3.1'              //用之前下載的工具根據框架包編譯項目
}
apt{                                                         //輸出日志文件
    arguments{
        trace true
        androidManifestFile variant.outputs[0].processResources.manifestFile
    }
}

android {
    compileSdkVersion 15
    buildToolsVersion "21.1.2"
    lintOptions{
        checkReleaseBuilds false
    }
    sourceSets {
        main {
            manifest.srcFile 'AndroidManifest.xml'
            java.srcDirs = ['src']
            resources.srcDirs = ['src']
            aidl.srcDirs = ['src']
            renderscript.srcDirs = ['src']
            res.srcDirs = ['res']
            assets.srcDirs = ['assets']
            jniLibs.srcDirs=['libs']
        }

        instrumentTest.setRoot('tests')

        debug.setRoot('build-types/debug')
        release.setRoot('build-types/release')
    }
}

大部分情況網絡情況不好下,這個包是下載不下來的,我們可以下載在本地放在libs文件下

compile 'org.androidannotations:androidannotations:3.3.1'          //導入框架包
    apt 'org.androidannotations:androidannotations:3.3.1'              //用之前下載的工具根據框架包編譯項目
使用方法
compile files('libs/androidannotations.jar')
  • 接下來我們使用了

閑話不多了,直接給代碼了,下面這段代碼是我們平時一般寫android的原生代碼

  1 public class BookmarksToClipboardActivity extends Activity {
  2   
  3   BookmarkAdapter adapter;
  4  
  5   ListView bookmarkList;
  6  
  7   EditText search;
  8  
  9   BookmarkApplication application;
 10  
 11   Animation fadeIn;
 12  
 13   ClipboardManager clipboardManager;
 14  
 15   @Override
 16   protected void onCreate(Bundle savedInstanceState) {
 17     super.onCreate(savedInstanceState);
 18  
 19     requestWindowFeature(Window.FEATURE_NO_TITLE);
 20     getWindow().setFlags(FLAG_FULLSCREEN, FLAG_FULLSCREEN);
 21  
 22     setContentView(R.layout.bookmarks);
 23  
 24     bookmarkList = (ListView) findViewById(R.id.bookmarkList);
 25     search = (EditText) findViewById(R.id.search);
 26     application = (BookmarkApplication) getApplication();
 27     fadeIn = AnimationUtils.loadAnimation(this, anim.fade_in);
 28     clipboardManager = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE);
 29  
 30     View updateBookmarksButton1 = findViewById(R.id.updateBookmarksButton1);
 31     updateBookmarksButton1.setOnClickListener(new OnClickListener() {
 32  
 33       @Override
 34       public void onClick(View v) {
 35         updateBookmarksClicked();
 36       }
 37     });
 38  
 39     View updateBookmarksButton2 = findViewById(R.id.updateBookmarksButton2);
 40     updateBookmarksButton2.setOnClickListener(new OnClickListener() {
 41  
 42       @Override
 43       public void onClick(View v) {
 44         updateBookmarksClicked();
 45       }
 46     });
 47  
 48     bookmarkList.setOnItemClickListener(new OnItemClickListener() {
 49  
 50       @Override
 51       public void onItemClick(AdapterView<?> p, View v, int pos, long id) {
 52         Bookmark selectedBookmark = (Bookmark) p.getAdapter().getItem(pos);
 53         bookmarkListItemClicked(selectedBookmark);
 54       }
 55     });
 56  
 57     initBookmarkList();
 58   }
 59  
 60   void initBookmarkList() {
 61     adapter = new BookmarkAdapter(this);
 62     bookmarkList.setAdapter(adapter);
 63   }
 64  
 65   void updateBookmarksClicked() {
 66     UpdateBookmarksTask task = new UpdateBookmarksTask();
 67  
 68     task.execute(search.getText().toString(), application.getUserId());
 69   }
 70   
 71   private static final String BOOKMARK_URL = //
 72   "http://www.bookmarks.com/bookmarks/{userId}?search={search}";
 73   
 74   
 75   class UpdateBookmarksTask extends AsyncTask<String, Void, Bookmarks> {
 76  
 77     @Override
 78     protected Bookmarks doInBackground(String... params) {
 79       String searchString = params[0];
 80       String userId = params[1];
 81  
 82       RestTemplate client = new RestTemplate();
 83       HashMap<String, Object> args = new HashMap<String, Object>();
 84       args.put("search", searchString);
 85       args.put("userId", userId);
 86       HttpHeaders httpHeaders = new HttpHeaders();
 87       HttpEntity<Bookmarks> request = new HttpEntity<Bookmarks>(httpHeaders);
 88       ResponseEntity<Bookmarks> response = client.exchange( //
 89           BOOKMARK_URL, HttpMethod.GET, request, Bookmarks.class, args);
 90       Bookmarks bookmarks = response.getBody();
 91  
 92       return bookmarks;
 93     }
 94  
 95     @Override
 96     protected void onPostExecute(Bookmarks result) {
 97       adapter.updateBookmarks(result);
 98       bookmarkList.startAnimation(fadeIn);
 99     }
100     
101   }
102  
103   void bookmarkListItemClicked(Bookmark selectedBookmark) {
104     clipboardManager.setText(selectedBookmark.getUrl());
105   }
106  
107 }
View Code

這段是我們用了框架后寫過的代碼

 1 @NoTitle
 2 @Fullscreen
 3 @EActivity(R.layout.bookmarks)
 4 public class BookmarksToClipboardActivity extends Activity {
 5   
 6   BookmarkAdapter adapter;
 7   
 8   @ViewById
 9   ListView bookmarkList;
10  
11   @ViewById
12   EditText search;
13   
14   @App
15   BookmarkApplication application;
16   
17   @RestService
18   BookmarkClient restClient;
19  
20   @AnimationRes
21   Animation fadeIn;
22   
23   @SystemService
24   ClipboardManager clipboardManager;
25  
26   @AfterViews
27   void initBookmarkList() {
28     adapter = new BookmarkAdapter(this);
29     bookmarkList.setAdapter(adapter);
30   }
31   
32   @Click({R.id.updateBookmarksButton1, R.id.updateBookmarksButton2})
33   void updateBookmarksClicked() {
34     searchAsync(search.getText().toString(), application.getUserId());
35   }
36   
37   @Background
38   void searchAsync(String searchString, String userId) {
39     Bookmarks bookmarks = restClient.getBookmarks(searchString, userId);
40     updateBookmarks(bookmarks);
41   }
42  
43   @UiThread
44   void updateBookmarks(Bookmarks bookmarks) {
45     adapter.updateBookmarks(bookmarks);
46     bookmarkList.startAnimation(fadeIn);
47   }
48   
49   @ItemClick
50   void bookmarkListItemClicked(Bookmark selectedBookmark) {
51     clipboardManager.setText(selectedBookmark.getUrl());
52   }
53  
54 }
View Code
1 @Rest("http://www.bookmarks.com")
2 public interface BookmarkClient {
3   
4   @Get("/bookmarks/{userId}?search={search}")
5   Bookmarks getBookmarks(String search, String userId);
6  
7 }
View Code

對比之后我們發現我們代碼少了很多,很多人可能會顧慮代碼少了,里面是不是做了很多消耗性能多余的操作,這里大家不用擔心,根據AndroidAnnotations寫的代碼,在編譯時生成子類,子類的代碼和原生一模一樣,所以對性能沒有影響

  • 常用地址
  1. api地址和demo地址https://github.com/excilys/androidannotations/wiki/Cookbook
  2. 下載地址https://github.com/excilys/androidannotations
  • 總結
  1. 基本語法就不和大家說呢,對程序員來說有了api文檔和demo就行了
  2. 這個框架語法很簡單用一下就會了,就是環境有點蛋疼,這里只說了一個IDE環境搭配,其它的大家可以看文檔
  3. 東西雖然很好,但是希望android初學者學好基礎后再來使用框架,框架是不斷推出新的,如果你基礎都不知道,以后變遷項目,或者項目報錯你會對很多錯誤很茫然的,對你以后的發展也不好。



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM