商城專案實戰 | 10.1 xUtils3 詳細介紹以及 ViewUtils 的使用方法
本文為菜鳥窩作者劉婷的連載。”商城專案實戰”系列來聊聊仿”京東淘寶的購物商城”如何實現。
剛開始的時候,在 GitHub 上面出現了一款強大的開源框架叫 xUtils,裡面包含了很多實用的android工具,並且支援大檔案上傳,更全面的 http 請求協議支援(10種謂詞),擁有更加靈活的 ORM,更多的事件註解支援且不受混淆影響,該框架最低相容版本為 android 2.2 (api level 8)。但是隨著 Android 版本的不斷更新,特別是 Android 6.0 之後,xUtils 的相容不是很好,因此就出現了升級版的 xUtils,也就是 xUtils3。
xUtils3 詳細介紹
xUtils3 是 xUtils 的升級版本,包含了orm, http(s), image, view註解, 但依然很輕量級(246K), 最主要是特性強大, 方便擴充套件,當然對比之前的 xUtils,在 xUtils3 中很多的 API 介面都已經改變了,使用方法也和之前不同了,所以本文主要是講解最新的 xUtils3 的詳細介紹以及該框架下的 ViewUtils 模組的最新用法。
1. xUtils3 的特性
1.1 xUtils3 的主要特性
xUtils3 的主要特性如下。
- 穩定的基石: AbsTask 和統一的回撥介面 Callback, 任何異常, 即使你的回撥方法實現有異常都會進入 onError,任何情況下 onFinished 總會讓你知道任務結束了。
- 基於高效穩定的 orm 工具,http 模組得以更方便的實現 cookie (支援 domain、 path、 expiry 等特性)和 快取(支援 Cache-Control、Last-Modified、 ETag 等特性)的支援。
- 有了強大的 http 及其下載快取的支援,image 模組的實現相當的簡潔,並且支援回收被 view 持有,但被 Mem Cache 移除的圖片,減少頁面回退時的閃爍。
- View 註解模組僅僅400多行程式碼卻靈活的支援了各種 View 注入和事件繫結, 包括擁有多了方法的 listener 的支援。
1.2 其他特性
xUtils3 的一些其他特性。
- 支援超大檔案(超過 2G )上傳。
- 更全面的 http 請求協議支援(11種謂詞),在 xUtils 中只支援10種謂詞。
- 擁有更加靈活的 ORM, 和 greenDao 一致的效能。
- 更多的事件註解支援且不受混淆影響。
- 圖片繫結支援 gif (受系統相容性影響, 部分 gif 檔案只能靜態顯示)、webp,支援圓角,圓形, 方形等裁剪,支援自動旋轉。
- 從 3.5.0 開始不再包含 libwebpbackport.so,需要在 Android4.2 以下裝置相容 webp 的請使用 3.4.0 版本。
2. xUtils3 主要四大模組
xUtils 中目前包括了主要的四大模組,分別為 DbUtils 模組、ViewUtils 模組、HttpUtils 模組以及 BitmapUtils 模組,下面對這四大模組進行介紹。
2.1 DbUtils 模組
- Android 中的 orm 框架,一行程式碼就可以進行增刪改查。
- 支援事務,預設關閉。
- 可通過註解自定義表名,列名,外來鍵,唯一性約束,NOT NULL約束,CHECK 約束等(需要混淆的時候請註解表名和列名)。
- 支援繫結外來鍵,儲存實體時外來鍵關聯實體自動儲存或更新。
- 自動載入外來鍵關聯實體,支援延時載入。
- 支援鏈式表達查詢,更直觀的查詢語義。
2.2 ViewUtils 模組
- android 中的 ioc 框架,完全註解方式就可以進行 UI,資源和事件繫結。
- 新的事件繫結方式,使用混淆工具混淆後仍可正常工作。
- 目前支援常用的20種事件繫結,比如 setClickListener 等。
2.3 HttpUtils 模組
- 支援同步,非同步方式的請求。
- 支援大檔案上傳,上傳大檔案不會出現 oom 記憶體溢位情況。
- 支援 GET,POST,PUT,MOVE,COPY,DELETE,HEAD,OPTIONS,TRACE,CONNECT 的請求。
- 下載支援301/302重定向,支援設定是否根據 Content-Disposition 重新命名下載的檔案。
- 返回文字內容的請求(預設只啟用了 GET 請求)支援快取,可設定預設過期時間和針對當前請求的過期時間。
2.4 BitmapUtils 模組
- 載入 Bitmap 的時候無需考慮 Bitmap 載入過程中出現的 oom 和 android 容器快速滑動時候出現的圖片錯位等現象。
- 支援載入網路圖片和本地圖片。
- 記憶體管理使用 lru 演算法,更好的管理 Bitmap 記憶體。
- 可配置執行緒載入執行緒數量,快取大小,快取路徑,載入顯示動畫等。
xUtils3 中 ViewUtils 的主要作用
ViewUtils 的主要作用有兩點,一是可以完全註解方式就可以進行 UI 繫結和事件繫結,另外一個就是無需 findViewById 和 setOnClickListener 等。而其中的 UI 繫結和事件繫結下面詳細介紹。
1. UI 繫結
UI 繫結簡而言之就是針對於控制元件和 View 了,分為多種繫結方法。
@ContentView(R.layout.view_acti); //setContentView 註解在activity的宣告上方
@ViewInject(R.id.lv_test); //反射view 註解在一個view宣告上
2. 事件繫結
事件繫結就是指監聽事件的註解,比如 setOnClickListener 等。
@Event(R.id.button) //將一個自定義的方法繫結到一個 view 的事件上
至於具體的使用方法就在下面了。
xUtils3 中 ViewUtils 的使用方法
xUtils3 框架中包含了很多的工具,主要的四大模組功能也很強大,這次主要是要講解其中的 ViewUtils 模組的使用。
1. Gradle 新增依賴
在 module 下的 build.gradle 檔案下面新增對 xUtils3 的依賴。
dependencies {
compile fileTree(include: ['*.jar'], dir: 'libs')
androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
exclude group: 'com.android.support', module: 'support-annotations'
})
compile 'com.android.support:appcompat-v7:25.2.0'
compile 'com.android.support.constraint:constraint-layout:1.0.1'
testCompile 'junit:junit:4.12'
compile 'org.xutils:xutils:3.5.0'
}
2. ViewUtils 初始化
在 Activity 和 Fragment 中初始化 ViewUtils 模組略有不同,所以就分開介紹了。
2.1 Activity 中初始化
在 Activity 中初始化比較簡單,直接在 onCreate 中一行程式碼就搞定了。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
x.view().inject(this);
}
2.2 Fragment 中初始化
Fragment 的生命週期依賴於 Activity,另外在 Fragment 中一些方法也與 Activity 不同,所以 ViewUtils 的初始化方法也不太一樣了。
private boolean injected = false;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
injected = true;
return x.view().inject(this, inflater, container);
}
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
if (!injected) {
x.view().inject(this, this.getView());
}
}
其中 injected 是用來標識是否已經注入了 View ,如果還沒有注入,在 onViewCreated 中要寫入注入 View 的方法。
3. ViewUtils 繫結控制元件
一般在 Activity 或者 Fragment 中宣告控制元件,都要使用方法 findViewById,如果控制元件一旦多了,就會很麻煩,程式碼要寫不少,但是使用 ViewUtils 可以通過註解的方式直接進行 UI 繫結,方法也很簡單。
@ViewInject(R.id.textView)
private TextView textView;
4. ViewUtils 繫結佈局
在為 Activity 或者 Fragment 添加布局時,我們都會使用到 setContentView(int layoutRes) 方法,在 ViewUtils 添加了直接註解佈局的方法,如下。
@ContentView(R.layout.activity_main)
public class MainActivity extends AppCompatActivity {
.....
}
在 Fragment 中註解方法是一樣的,在 Fragment 中直接新增就好。
5. ViewUtils 繫結事件
在之前的按鈕的點選事件、列表選項的 item 點選事件等,寫起來程式碼都比較多些,而使用 ViewUtils 都可以變得簡單起來,先來看下按鈕的點選事件的繫結。
// 取消了之前使用方法名繫結事件的方式,使用id繫結不受混淆影響
// 支援繫結多個id @Event({R.id.id1, R.id.id2, R.id.id3})
// or @Event(value={R.id.id1, R.id.id2, R.id.id3}, parentId={R.id.pid1, R.id.pid2, R.id.pid3})
// 更多事件支援參見ViewCommonEventListener類和包com.lidroid.xutils.view.annotation.event。
@Event(R.id.test_button)
public void testButtonClick(View v) { // 方法簽名必須和介面中的要求一致
...
}
上面是按鈕的點選事件的繫結,很方便,再來看看列表選項的 item 點選事件的繫結。
//選項的點選事件 OnItemClickListener
@Event(value = R.id.lv_img, type = AdapterView.OnItemClickListener.class)
private void onImageItemClick(AdapterView<?> parent, View view, int position, long id) {
....
}
ViewUtils 所支援的事件的繫結還有很多種,這裡就主要介紹上面兩種,更多的使用方法請參考 xUtils3 原始碼。
結束語
xUtils3 在 xUtils 的基礎上優化了不少,ViewUtils 註解也更為的簡單明瞭,有了 ViewUtils,我們就不用像之前一樣不斷的對控制元件進行宣告,另外對於事件的處理也簡化了不少,在後期的商城專案實戰中,都將使用 ViewUtils 來做 UI 的繫結以及事件的繫結。