xUtils框架
微信賬號申請終於通過了,這是我們第一次Android乾貨分享。想來是第一次,要對得起“乾貨”二字。今天我要為大家推薦的是一個Android基於快速開發的一個框架——xUtils,它是在aFinal基礎上進行重構和擴充套件的框架,相比aFinal有很大的改善。同時,如果如果你的應用是基於網路的,那麼只要處理得當,它會讓你徹底的擺脫各種工具類和重複程式碼的困擾。好的,廢話不多說,程式猿們還是程式碼說起。
xUtils 包含了很多實用的android工具。xUtils 源於Afinal框架,對Afinal進行了大量重構,使得xUtils支援大檔案上傳,更全面的http請求協議支援,擁有更加靈活的ORM,更多的事件註解支援且不受混淆影響。同時需要注意的是,xUitls最低相容android 2.2 (api level 8) 。今天我們的主題是整體介紹下xUtils,主要介紹它重要的四大元件。具體各個元件的使用,會在之後幾天陸續為大家奉上。下面開始:
一、ViewUtils
你受夠了重複冗長的findViewById了嘛?你受夠了各種監聽事件的繫結了嘛?在這裡,你只需要一句註解,如@ViewInject、@OnClick,就能輕鬆擺脫小白似的程式碼,大大的上了一個檔次。
二、HttpUtils
支援的HTTP七種請求方式,非常便捷的滿足你的介面請求的需要。同時還支援大檔案上傳下載,以及同步非同步請求。
三、BitmapUtils
你的程式因OOM強制關閉過嘛?你在為加在網路圖片頭疼嘛?有了元件,你將永久擺脫前面的問題。
四、DbUtils
簡單易用又出色的ORM框架,真的是誰用誰知道,直接輕鬆儲存各種物件到sqlite資料庫中,同時也能非常方便的進行各種條件查詢,甚至分頁查詢,還有對錶中資料的更新刪除等操作,真正的實現。一行程式碼就可以進行增刪改查。並且可通過註解自定義表名,列名,外來鍵,唯一性約束,NOT NULL約束,CHECK約束等,支援事務。
由於xUtils是基於aFinal的,這個開源框架是國內的某位大神寫的,所以瞭解了aFinal之後再回頭看xUtils,才會更有收穫。同時,也要向這位大神以及眾多的開源貢獻者致敬,有了他們的奉獻和開源的精神,才湧現出一個個耳熟能詳的更加優秀的更加穩定的框架。我們眾所周知的Linux就是這麼誕生的。
aFinal學習地址:http://www.afinal.org
昨天對xUtils整體上做了一個簡單的介紹,今天我們們就程式碼碼起,真刀實槍的也看看,看看如何快速便捷的把xUtils給整合到大家的專案中去。xUtils中有四大元件可以供我們使用,分別是ViewUtils、HttpUtils、BitmapUtils以及DbUtils。如果你沒能先讀一下我的上一篇文章,那麼請你移步過去先整體瞭解一下,再回過頭來看這篇文章,相信你回更有體會的。
下面依次開始介紹這些元件具體的使用。
一、ViewUtils android中得ioc(控制反轉)框架,可以完全使用註解的方式來完成UI的繫結和事件繫結。簡單的說,ViewUtils的功能就是做這個的,但是可以說,就這麼個功能確是能極大的簡化我們的程式碼。下面我們看下具體的程式碼,順便對比下註解的方式繫結ID和findViewById之間的差別。
- <span style="white-space:pre"> </span>@ViewInject(R.id.btn)
- private Button btn;
- @ViewInject(R.id.img)
- private ImageView img;
- @ViewInject(R.id.list)
- private ListView list;
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_second);
- ViewUtils.inject(this);}
- <p style="margin-top:0px; margin-bottom:0px; font-size:14px; font-family:Monaco; color:rgb(119,119,119)"></p>
- <span style="white-space:pre"> </span>@Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_second);
- btn = (Button) findViewById(R.id.btn);
- img = (ImageView) findViewById(R.id.img);
- list = (ListView) findViewById(R.id.list);
- }
如果專案中得Activity中的控制元件相當多,那麼想象一下程式碼中累積的那一大坨就真心受不了。通過xUtils的簡單註解,就能輕鬆擺脫無盡壞味道的程式碼。
注意:在使用註解繫結控制元件的時候,一定記得在onCreate中呼叫ViewUtils.inject(this);
下面我們再對比下Android中事件繫結的區別。
- <span style="white-space:pre"> </span>@OnClick({ R.id.btn, R.id.img })
- public void clickMethod(View v) {
- Toast.makeText(SecondActivity.this, "you clicked button!",
- Toast.LENGTH_SHORT).show();
- }
- @OnItemClick(R.id.list)
- public void itemClick(AdapterView<?> parent, View view, int position,long id) {
- Toast.makeText(SecondActivity.this, "position--->" + position,
- Toast.LENGTH_SHORT).show();
- }
- <span style="white-space:pre"> </span>btn.setOnClickListener(this);
- list.setOnItemClickListener(new OnItemClickListener() {
- @Override
- public void onItemClick(AdapterView<?> parent, View view,
- int position, long id) {
- Toast.makeText(SecondActivity.this, "position--->" + position,
- Toast.LENGTH_SHORT).show();
- }
- });<pre name="code" class="java"><span style="white-space:pre"> </span>@Override
- public void onClick(View v) {
- switch (v.getId()) {
- case R.id.btn:
- Toast.makeText(SecondActivity.this, "you clicked button!",
- Toast.LENGTH_SHORT).show();
- break;
- default:
- break;
- }
- }</pre><br>
注意:在使用註解監聽事件的時候,監聽方法名是自定義的,但是一定要保證方法的訪問修飾符為public,同時方法的引數要與Android原來的監聽方法引數一致,不僅引數型別,而且要保證引數的順序。
二、BitmapUtils 載入網路或本地bitmap的時候無需擔心再遇到OOM的現象,管理bitmap的記憶體採用了LRU演算法,同時也能避免列表滑動過程中發生圖片錯位等得現象。載入網路圖片時,還可以配置執行執行緒的數量,快取路徑等。。。通過BitmapUtils的各種構造器,可以很方便的建立出本地快取路徑和快取的大小,以及記憶體快取的大小。
- <span style="white-space:pre"> </span>BitmapUtils utils = new BitmapUtils(this);
- BitmapDisplayConfig config = new BitmapDisplayConfig(this);
- config.setLoadingDrawable(getResources().getDrawable(R.drawable.loading));
- config.setLoadFailedDrawable(getResources().getDrawable(R.drawable.failed));
- config.setImageLoadCallBack(new ImageLoadCallBack() {
- @Override
- public void loadFailed(ImageView imageView, Drawable drawable) {
- }
- @Override
- public void loadCompleted(ImageView imageView, Drawable drawable,
- BitmapDisplayConfig config) {
- }
- });
- config.setBitmapMaxWidth(480);
- config.setBitmapMaxHeight(720);
- / utils.display(img, "http://img1.gtimg.com/news/pics/hv1/63/26/1451/94357968.jpg");
- utils.display(img, "http://img1.gtimg.com/news/pics/hv1/63/26/1451/94357968.jpg", config);
BitmapUtils在用來載入網路圖片時,可以配置載入圖片尺寸的大小,載入成功和失敗的回撥以及載入過程中圖片的配置。同時也可以選擇不配置。
- //bitmapUtils.display(testImageView, "/sdcard/test.jpg"); //支援載入本地圖片
- // 使用ListView等容器展示圖片時可通過PauseOnScrollListener控制滑動和快速滑動過程中時候暫停載入圖片
- listView.setOnScrollListener(new PauseOnScrollListener(bitmapUtils, false, true));
- listView.setOnScrollListener(new PauseOnScrollListener(bitmapUtils, false, true), customListener);
接上回,繼續介紹xUtils的最後兩個模組:DbUtils和HttpUtils。首先先介紹第一個SQLite資料庫操縱的簡單ORM框架,只要能理解xUtils為我們提供的api,相信你也能熟練的把DbUtils用到專案中去。
操縱資料庫的工具類,無論多牛X,總離不開最根本的CRUD,即建立,查詢,更新和刪除。下面從這四個角度依次介紹xUtils是如何簡便持久化資料的。大家都知道,在Android裡面如果要儲存一個物件,我們需要建立一個SQLiteOpenHelper,然後還得建立一張對應物件各個屬性的表,還得繼續把我們的物件轉換成ContentValues,進而去儲存。真心是麻煩的不能再麻煩了,我們現在介紹的DbUtils就能讓你輕鬆解脫麻繩一樣的程式碼。DbUtils在進行save操作的時候,會根據java反射反射出物件的各個欄位,然後去查詢資料庫中是否存在這個物件型別對應的表,如果表已經存在,直接進行插入操作;如果不存在,就先動態的建立的一張對應我們物件的表,再進行插入處理。直接上程式碼,大家看。
- <span style="white-space:pre"> </span>@OnClick(R.id.insert)
- public void insert(View v) {
- Student stu = null;
- for (int i = 0; i < 20; i++) {
- stu = new Student();
- stu.setAge(10 + i);
- stu.setName("jack" + i);
- mList.add(stu);
- try {
- dbUtils.save(stu);
- } catch (DbException e) {
- e.printStackTrace();
- }
- }
- }
DbUtils可以幫助對SQL語句不是很熟悉的同學快速的實現查詢,而不用去寫sql查詢語句,而且可以對查詢結果進行排序和分頁,使用簡單,功能強大。大家可以看下,下面的幾行程式碼就能實現複雜的查詢功能
- <span style="white-space:pre"> </span>dbUtils.findAll(Selector.from(Student.class)
- <span style="white-space:pre"> </span>.where("_id", "<", 10).and("age", ">", 10).orderBy("_id")
- <span style="white-space:pre"> </span>.limit(pageSize).offset(pageSize * pageIndex));
- <span style="white-space:pre"> </span>@OnClick(R.id.update)
- public void update(View v){
- try {
- List<Student> stus = dbUtils.findAll(Selector.from(Student.class));
- Student stu = stus.get(0);
- stu.setAge(20);
- dbUtils.update(stu);
- } catch (DbException e) {
- e.printStackTrace();
- }
- }
最後一個就是資料的刪除。一個實體物件,一組實體物件,根據條件刪除,刪除表,刪除整個資料庫,這些操作都可以通過一句簡單的程式碼來實現,看了程式碼就明白了。
- @OnClick(R.id.delete)
- public void delete(View v){
- try {
- List<Student> stus = dbUtils.findAll(Selector.from(Student.class));
- dbUtils.delete(stus.get(0));
- dbUtils.deleteAll(stus);
- dbUtils.deleteById(Student.class, WhereBuilder.b("age", "==", 20));
- dbUtils.dropTable(Student.class);
- dbUtils.dropDb();
- } catch (DbException e) {
- e.printStackTrace();
- }
- }
今天介紹xUtils的最後一個模組——HttpUtils,拖了那麼久,終於要結束了。另外,碼字不易,如果大家有什麼疑問和見解,歡迎大家留言討論。HttpUtils是解決日常工作過程中繁雜的上傳下載檔案以及各種Get和post請求的必備工具類,通過這個類,開源非常方便關注介面的業務,不必再再寫那麼冗長的程式碼。下面全文都圍繞著四個中心點去依次展開,分別是:HttpGet請求,HttpPost請求,下載檔案和上傳檔案。
HttpGet請求。相信從事Android網路應用的開發的同學對這個一定不會陌生,長期的開發會讓大家積累下一個可以複用的工具類。而xUtils就是幫助了我們把那些工具類給抽象整合成一個更具擴充套件性的幫助類。比如HtttpGet請求,這裡只簡要介紹下關鍵的應用方法,具體的細節還請大家自己去下載xUtils的原始碼去研究研究了,我們介紹的足夠應用到我們的應用開發中去了。通常的HttpGet請求會把一系列的請求引數掛在請求地址的後面,拖出一節長長的尾巴,十分的惹人厭,這裡可以通過像HttpPost請求的引數那樣組成一個類似BasicNameValuePair的物件直接封裝到請求方法中去,省去拼接url的麻煩,同時也可以設定超時時間。另外請求的方法中提供了一個回撥類,這個類中有處理不同請求結果的回撥方法,比如說請求過程中的回撥,請求成功的回撥以及請求出現錯誤時的回撥。下面直接上程式碼看下。
- RequestParams params = new RequestParams();
- params.addQueryStringParameter("method", "info");
- params.addQueryStringParameter("access_token",
- "3.1042851f652496c9362b1cd77d4f849b.2592000.1377530363.3590808424-248414");
- HttpUtils http = new HttpUtils();
- http.configCurrentHttpGetCacheExpiry(1000 * 10);
- http.send(HttpRequest.HttpMethod.GET,
- "https://pcs.baidu.com/rest/2.0/pcs/quota",
- params,
- new RequestCallBack<String>() {
- @Override
- public void onStart() {
- resultText.setText("conn...");
- }
- @Override
- public void onLoading(long total, long current) {
- resultText.setText(current + "/" + total);
- }
- @Override
- public void onSuccess(String result) {
- resultText.setText("response:" + result);
- }
- @Override
- public void onFailure(HttpException error, String msg) {
- resultText.setText(msg);
- }
- });
HttpPost請求。為了統一請求的風格,HttpPost請求的方式和HttpGet的幾乎可以說是一模一樣,一樣提供了各種對應不同結果的回撥方法,大家自己看下面的程式碼就曉得了,真是一目瞭然。
- RequestParams params = new RequestParams();
- params.addQueryStringParameter("method", "mkdir");
- params.addQueryStringParameter("access_token", "3.1042851f652496c9362b1cd77d4f849b.2592000.1377530363.3590808424-248414");
- params.addBodyParameter("path", "/apps/測試應用/test資料夾");
- HttpUtils http = new HttpUtils();
- http.send(HttpRequest.HttpMethod.POST,
- "https://pcs.baidu.com/rest/2.0/pcs/file",
- params,
- new RequestCallBack<String>() {
- @Override
- public void onStart() {
- resultText.setText("conn...");
- }
- @Override
- public void onLoading(long total, long current) {
- resultText.setText(current + "/" + total);
- }
- @Override
- public void onSuccess(String result) {
- resultText.setText("upload response:" + result);
- }
- @Override
- public void onFailure(HttpException error, String msg) {
- resultText.setText(msg);
- }
- });
下面為大家介紹一個非常非常實用的功能,就是通過Http協議去下載檔案,再也不必為Android中下載檔案而寫下一大坨一大坨的程式碼,如此長的程式碼除錯起來真是能氣死人。還記得以前做過一個專案,有個需求就是能下載視訊的,而且還要能支援斷點下載,只寫那麼一個下載工具類就寫了一兩天,再加上除錯,真心把人都給逼瘋了。要是xUtils早點在那個時候面世,想那時做那個需求也不必那麼通過。HttpUtils為開發者提供了非常方便的下載api,可以通過簡單的幾個引數來實現下載,甚至斷點下載的功能。上程式碼。
- <span style="white-space:pre"> </span>HttpHandler handler = http.download(
- downloadAddrEdit.getText().toString(),
- "/sdcard/fileexplorer.apk",
- true, // 如果目標檔案存在,接著未完成的部分繼續下載。
- true, // 如果從請求返回資訊中獲取到檔名,下載完成後自動重新命名。
- new RequestCallBack<File>() {
- @Override
- public void onStart() {
- resultText.setText("conn...");
- }
- @Override
- public void onLoading(long total, long current) {
- resultText.setText(current + "/" + total);
- }
- @Override
- public void onSuccess(File result) {
- resultText.setText("downloaded:" + result.getPath());
- }
- @Override
- public void onFailure(HttpException error, String msg) {
- resultText.setText(error.getExceptionCode() + ":" + msg);
- }
- });
最後介紹的功能就是上傳檔案了,這個也是在專案中也是非常常見的。比如使用者上傳頭像,再比如網盤應用需要把本地檔案上傳到雲端等等。同時HttpUtils也同時為開發者提供了上傳過程中和上傳結果的各個回撥介面。大家在使用HttpUtils上傳檔案的時候,只要仿照下面的程式碼去碼程式碼就快可以基本滿足業務的需要了。
- <strong> </strong>RequestParams params = new RequestParams();
- params.addQueryStringParameter("method", "upload");
- params.addQueryStringParameter("path", "/apps/測試應用/test.zip");
- // 請在百度的開放access_tokenapi測試頁面找到自己的access_token
- params.addQueryStringParameter("access_token", "3.1042851f652496c9362b1cd77d4f849b.2592000.1377530363.3590808424-248414");
- params.addBodyParameter("file", new File("/sdcard/test.zip"));
- HttpUtils http = new HttpUtils();
- http.send(HttpRequest.HttpMethod.POST,
- "https://pcs.baidu.com/rest/2.0/pcs/file",
- params,
- new RequestCallBack<String>() {
- @Override
- public void onStart() {
- resultText.setText("conn...");
- }
- @Override
- public void onLoading(long total, long current) {
- resultText.setText(current + "/" + total);
- }
- @Override
- public void onSuccess(String result) {
- resultText.setText("upload response:" + result);
- }
- @Override
- public void onFailure(HttpException error, String msg) {
- resultText.setText(msg);
- }
- });
相關文章
- Android精通之OrmLite資料庫框架,Picasso框架,Okio框架,OKHttp框架AndroidORM資料庫框架HTTP
- 最好的 Go 框架:沒有框架?Go框架
- 微服務框架-dubbo整合nacos框架微服務框架
- golang web框架,golang版本laravel 框架GolangWeb框架Laravel
- bo 框架之 beego 框架 model curd框架Go
- 前端框架開發之Niu框架——從零學框架的小白前端框架
- Django框架,Flask框架和Tornado框架各有什麼優缺點Django框架Flask
- 執行時框架,編譯時框架框架編譯
- Spring框架 - Spring和Spring框架組成Spring框架
- 【SSH框架】系列之 Spring 整合 Hibernate 框架框架Spring
- Truffle框架框架
- Gorm框架GoORM框架
- Scrapy框架框架
- cms 框架框架
- express框架Express框架
- Hibernate框架框架
- SSM框架SSM框架
- 全新框架框架
- 基本框架框架
- Mybatis框架MyBatis框架
- 集合框架框架
- HTML 框架HTML框架
- ForkJoin框架框架
- 前端框架前端框架
- LayUI框架UI框架
- MVC框架MVC框架
- picasso框架框架
- Django是同步框架還是非同步框架Django框架非同步
- wsgiref模組、web框架、django框架簡介Web框架Django
- 中介軟體增強框架之-CaptureFramework框架框架APTFramework
- Netty 框架學習 —— 編解碼器框架Netty框架
- Flutter框架分析(四)-- Flutter框架的執行Flutter框架
- 【JavaScript框架封裝】公共框架的封裝JavaScript框架封裝
- Scrapy框架的使用之Scrapy框架介紹框架
- java框架之Hibernate框架知識點整理。Java框架
- 駁 《駁 《駁 《駁 《停止學習框架》》》》、《駁 《駁 《停止學習框架》》》、《駁 《停止學習框架》》、《停止學習框架》框架
- T框架介紹(自動化測試框架)框架
- Flask框架和Django框架有什麼區別?Flask框架Django
- DIY 實現 ThinkPHP 核心框架(七)定義框架PHP框架