1. 程式人生 > >商城專案實戰 | 10.1 xUtils3 詳細介紹以及 ViewUtils 的使用方法

商城專案實戰 | 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 的主要特性如下。

  1. 穩定的基石: AbsTask 和統一的回撥介面 Callback, 任何異常, 即使你的回撥方法實現有異常都會進入 onError,任何情況下 onFinished 總會讓你知道任務結束了。
  2. 基於高效穩定的 orm 工具,http 模組得以更方便的實現 cookie (支援 domain、 path、 expiry 等特性)和 快取(支援 Cache-Control、Last-Modified、 ETag 等特性)的支援。
  3. 有了強大的 http 及其下載快取的支援,image 模組的實現相當的簡潔,並且支援回收被 view 持有,但被 Mem Cache 移除的圖片,減少頁面回退時的閃爍。
  4. View 註解模組僅僅400多行程式碼卻靈活的支援了各種 View 注入和事件繫結, 包括擁有多了方法的 listener 的支援。

1.2 其他特性

xUtils3 的一些其他特性。

  1. 支援超大檔案(超過 2G )上傳。
  2. 更全面的 http 請求協議支援(11種謂詞),在 xUtils 中只支援10種謂詞。
  3. 擁有更加靈活的 ORM, 和 greenDao 一致的效能。
  4. 更多的事件註解支援且不受混淆影響。
  5. 圖片繫結支援 gif (受系統相容性影響, 部分 gif 檔案只能靜態顯示)、webp,支援圓角,圓形, 方形等裁剪,支援自動旋轉。
  6. 從 3.5.0 開始不再包含 libwebpbackport.so,需要在 Android4.2 以下裝置相容 webp 的請使用 3.4.0 版本。

2. xUtils3 主要四大模組

xUtils 中目前包括了主要的四大模組,分別為 DbUtils 模組、ViewUtils 模組、HttpUtils 模組以及 BitmapUtils 模組,下面對這四大模組進行介紹。

2.1 DbUtils 模組

  1. Android 中的 orm 框架,一行程式碼就可以進行增刪改查。
  2. 支援事務,預設關閉。
  3. 可通過註解自定義表名,列名,外來鍵,唯一性約束,NOT NULL約束,CHECK 約束等(需要混淆的時候請註解表名和列名)。
  4. 支援繫結外來鍵,儲存實體時外來鍵關聯實體自動儲存或更新。
  5. 自動載入外來鍵關聯實體,支援延時載入。
  6. 支援鏈式表達查詢,更直觀的查詢語義。

2.2 ViewUtils 模組

  1. android 中的 ioc 框架,完全註解方式就可以進行 UI,資源和事件繫結。
  2. 新的事件繫結方式,使用混淆工具混淆後仍可正常工作。
  3. 目前支援常用的20種事件繫結,比如 setClickListener 等。

2.3 HttpUtils 模組

  1. 支援同步,非同步方式的請求。
  2. 支援大檔案上傳,上傳大檔案不會出現 oom 記憶體溢位情況。
  3. 支援 GET,POST,PUT,MOVE,COPY,DELETE,HEAD,OPTIONS,TRACE,CONNECT 的請求。
  4. 下載支援301/302重定向,支援設定是否根據 Content-Disposition 重新命名下載的檔案。
  5. 返回文字內容的請求(預設只啟用了 GET 請求)支援快取,可設定預設過期時間和針對當前請求的過期時間。

2.4 BitmapUtils 模組

  1. 載入 Bitmap 的時候無需考慮 Bitmap 載入過程中出現的 oom 和 android 容器快速滑動時候出現的圖片錯位等現象。
  2. 支援載入網路圖片和本地圖片。
  3. 記憶體管理使用 lru 演算法,更好的管理 Bitmap 記憶體。
  4. 可配置執行緒載入執行緒數量,快取大小,快取路徑,載入顯示動畫等。

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 的繫結以及事件的繫結。