自(zì)強不息    厚德載物(wù)

Android開(kāi)源庫——xUtils框架

  2023/7/21 9:00:00   【次浏覽】 本站

xUtils框架

概述

主要是用于快速開(kāi)發,相(xiàng)當于一個(gè)工(gōng)具集?


終于有(yǒu)一個(gè)國(guó)人(rén)開(kāi)發的(de)了!!!


簡介終于是中文(wén)的(de)了,大部分介紹內(nèi)容都(dōu)是來(lái)自(zì)于項目地(dì)址上(shàng)的(de)介紹,可以跳(tiào)過這(zhè)部分


項目地(dì)址(舊(jiù)版):GitHub - qxbl/xUtils: android orm, bitmap, http, view inject...


項目地(dì)址(新版):GitHub - wyouflf/xUtils3: Android orm, bitmap, http, view inject...


xUtils2.x介紹

xUtils 2.x對(duì)Android 6.0兼容不是很(hěn)好(hǎo), 請盡快升級至xUtils3.

xUtils 包含了很(hěn)多實用的(de)android工(gōng)具。

xUtils 支持大文(wén)件(jiàn)上(shàng)傳,更全面的(de)http請求協議(yì)支持(10種謂詞),擁有(yǒu)更加靈活的(de)ORM,更多的(de)事(shì)件(jiàn)注解支持且不受混淆影響...

xUitls 最低(dī)兼容android 2.2 (api level 8)

xUtils3介紹

xUtils 包含了orm, http(s), image, view注解, 但(dàn)依然很(hěn)輕量級(246K), 并且特性強大, 方便擴展:


穩定的(de)基石: AbsTask和(hé)統一的(de)回調接口Callback, 任何異常, 即使你(nǐ)的(de)回調方法實現(xiàn)有(yǒu)異常都(dōu)會進入onError, 任何情況下(xià)onFinished總會讓你(nǐ)知道(dào)任務結束了.

基于高(gāo)效穩定的(de)orm工(gōng)具, http模塊得以更方便的(de)實現(xiàn)cookie(支持domain, path, expiry等特性)和(hé) 緩存(支持Cache-Control, Last-Modified, ETag等特性)的(de)支持.

有(yǒu)了強大的(de)http及其下(xià)載緩存的(de)支持, image模塊的(de)實現(xiàn)相(xiàng)當的(de)簡潔, 并且支持回收被view持有(yǒu), 但(dàn)被Mem Cache移除的(de)圖片, 減少頁面回退時(shí)的(de)閃爍..

view注解模塊僅僅400多行代碼卻靈活的(de)支持了各種View注入和(hé)事(shì)件(jiàn)綁定, 包括擁有(yǒu)多了方法的(de)listener的(de)支持.

四大模塊

DbUtils模塊:


android中的(de)orm框架,一行代碼就可以進行增删改查;

支持事(shì)務,默認關閉;

可通(tōng)過注解自(zì)定義表名,列名,外(wài)鍵,唯一性約束,NOT NULL約束,CHECK約束等(需要混淆的(de)時(shí)候請注解表名和(hé)列名);

支持綁定外(wài)鍵,保存實體(tǐ)時(shí)外(wài)鍵關聯實體(tǐ)自(zì)動保存或更新;

自(zì)動加載外(wài)鍵關聯實體(tǐ),支持延時(shí)加載;

支持鏈式表達查詢,更直觀的(de)查詢語義,參考下(xià)面的(de)介紹或sample中的(de)例子(zǐ)。

ViewUtils模塊:


android中的(de)ioc框架,完全注解方式就可以進行UI,資源和(hé)事(shì)件(jiàn)綁定;

新的(de)事(shì)件(jiàn)綁定方式,使用混淆工(gōng)具混淆後仍可正常工(gōng)作(zuò);

目前支持常用的(de)20種事(shì)件(jiàn)綁定,參見ViewCommonEventListener類和(hé)包com.lidroid.xutils.view.annotation.event。

HttpUtils模塊:


支持同步,異步方式的(de)請求;

支持大文(wén)件(jiàn)上(shàng)傳,上(shàng)傳大文(wén)件(jiàn)不會oom;

支持GET,POST,PUT,MOVE,COPY,DELETE,HEAD,OPTIONS,TRACE,CONNECT請求;

下(xià)載支持301/302重定向,支持設置是否根據Content-Disposition重命名下(xià)載的(de)文(wén)件(jiàn);

返回文(wén)本內(nèi)容的(de)請求(默認隻啓用了GET請求)支持緩存,可設置默認過期時(shí)間(jiān)和(hé)針對(duì)當前請求的(de)過期時(shí)間(jiān)。

BitmapUtils模塊:


加載bitmap的(de)時(shí)候無需考慮bitmap加載過程中出現(xiàn)的(de)oom和(hé)android容器(qì)快速滑動時(shí)候出現(xiàn)的(de)圖片錯(cuò)位等現(xiàn)象;

支持加載網絡圖片和(hé)本地(dì)圖片;

內(nèi)存管理(lǐ)使用lru算(suàn)法,更好(hǎo)的(de)管理(lǐ)bitmap內(nèi)存;

可配置線程加載線程數量,緩存大小(xiǎo),緩存路(lù)徑,加載顯示動畫(huà)等...

案例

導入

導入的(de)方式還(hái)是之前那(nà)幾種


Android開(kāi)源庫——Universal Image Loader_舊(jiù)日(rì)燈塔的(de)博客-CSDN博客_universalimageloader


不過本文(wén)的(de)案例都(dōu)是基于2.x的(de)案例,新版本的(de)話(huà)讀者可以自(zì)行去(qù)項目地(dì)址上(shàng)學習(xí)如何使用


3.0已經可以通(tōng)過Gradle構建(2.x真的(de)不行嗎(ma)?不清楚...反正介紹上(shàng)沒看(kàn)到)


compile 'org.xutils:xutils:3.5.1'

新版As可能會提示用implementation替換compile,照(zhào)做即可


權限

無論是哪個(gè)版本權限都(dōu)是這(zhè)兩個(gè)


<uses-permission android:name="android.permission.INTERNET" />

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

DbUtils模塊

(數據庫相(xiàng)關)


創建實體(tǐ)類User.java,生(shēng)成構造方法,get、set、toString方法


package com.example.a5_18xutils;

 

public class User {

    private int id;

    private String name;

    private String email;

 

    public int getId() {

        return id;

    }

 

    public void setId(int id) {

        this.id = id;

    }

 

    public User(String email, String name) {

        this.email = email;

        this.name = name;

    }

 

    public String getEmail() {

        return email;

    }

 

    public void setEmail(String email) {

        this.email = email;

    }

 

    public String getName() {

        return name;

    }

 

    public void setName(String name) {

        this.name = name;

    }

 

    public User() {

    }

 

    @Override

    public String toString() {

        return "User{" +

                "email='" + email + '\'' +

                ", id=" + id +

                ", name='" + name + '\'' +

                '}';

    }

}

 


布局


既然是數據庫操作(zuò),離不開(kāi)增删改查,那(nà)就添加五個(gè)按鈕綁定五個(gè)方法即可(查詢兩個(gè),一個(gè)查詢全部,一個(gè)條件(jiàn)查詢)


<?xml version="1.0" encoding="utf-8"?>

<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"

    xmlns:app="http://schemas.android.com/apk/res-auto"

    xmlns:tools="http://schemas.android.com/tools"

    android:layout_width="match_parent"

    android:layout_height="match_parent"

    tools:context=".MainActivity">

 

    <Button

        android:layout_width="match_parent"

        android:layout_height="wrap_content"

        android:id="@+id/add"

        android:onClick="add"

        android:text="增加"

        app:layout_constraintTop_toTopOf="parent"

        />

 

    <Button

        android:layout_width="match_parent"

        android:layout_height="wrap_content"

        android:id="@+id/delete"

        android:onClick="delete"

        android:text="删除"

        app:layout_constraintTop_toBottomOf="@+id/add"

        />

 

    <Button

        android:layout_width="match_parent"

        android:layout_height="wrap_content"

        android:id="@+id/update"

        android:onClick="update"

        android:text="修改"

        app:layout_constraintTop_toBottomOf="@+id/delete"

        />

 

    <Button

        android:layout_width="match_parent"

        android:layout_height="wrap_content"

        android:id="@+id/query"

        android:onClick="query"

        android:text="條件(jiàn)查詢"

        app:layout_constraintTop_toBottomOf="@+id/update"

        />

 

    <Button

        android:layout_width="match_parent"

        android:layout_height="wrap_content"

        android:id="@+id/query_all"

        android:onClick="query_all"

        android:text="查詢全部"

        app:layout_constraintTop_toBottomOf="@+id/query"

        />

</android.support.constraint.ConstraintLayout>


完整代碼


package com.example.a5_18xutils;

 

import android.support.v7.app.AppCompatActivity;

import android.os.Bundle;

import android.util.Log;

import android.view.View;

import android.widget.Toast;

 

import com.lidroid.xutils.DbUtils;

import com.lidroid.xutils.db.sqlite.Selector;

import com.lidroid.xutils.db.sqlite.WhereBuilder;

import com.lidroid.xutils.exception.DbException;

 

 

import java.util.List;

 

public class MainActivity extends AppCompatActivity {

    DbUtils dbUtils;

 

    @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);

        //第二個(gè)參數為(wèi)數據庫名,是可以改的(de)

        dbUtils = DbUtils.create(this, "mydb");

    }

 

    //增加

    public void add(View v) {

        User user = new User("test@qq.com", "被添加的(de)姓名");

        try {

            dbUtils.save(user);

            Toast.makeText(this, "save success", Toast.LENGTH_SHORT).show();

            Log.i("tag", "save success");

        } catch (com.lidroid.xutils.exception.DbException e) {

            e.printStackTrace();

        }

    }

 

    //查詢全部

    public void query_all(View v) {

        try {

            List<User> list = dbUtils.findAll(User.class);

            for (User u : list) {

                Log.i("tag", String.valueOf(u));

            }

        } catch (com.lidroid.xutils.exception.DbException e) {

            e.printStackTrace();

        }

    }

 

    //條件(jiàn)查找

    public void query(View view) {

        try {

            User user = dbUtils.findFirst(Selector.from(User.class).where("name", "=", "被添加的(de)姓名"));

            Toast.makeText(this, user.toString(), Toast.LENGTH_SHORT).show();

            Log.i("tag", String.valueOf(user));

        } catch (com.lidroid.xutils.exception.DbException e) {

            e.printStackTrace();

        }

    }

 

    //修改

    public void update(View view) {

        User user = new User();

        user.setId(1);

        user.setEmail("test@qq.com");

        user.setName("添加的(de)姓名被修改了");

        try {

            dbUtils.update(user, "email", "name");

            Toast.makeText(this, "更新成功", Toast.LENGTH_SHORT).show();

            

            Log.i("tag", "更新成功");

        } catch (com.lidroid.xutils.exception.DbException e) {

            e.printStackTrace();

        }

    }

 

    ///删除

    public void delete(View view) {

        try {

            dbUtils.delete(User.class, WhereBuilder.b("id", "=", "1"));

            Toast.makeText(this, "删除成功", Toast.LENGTH_SHORT).show();

            Log.i("tag", "删除成功");

        } catch (DbException e) {

            e.printStackTrace();

        }

    }

}

 


效果(以下(xià)測試為(wèi)按順序執行)


增加

ae69cc24cdd7b5527d91f636a2cb2b2f_watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L25pc2hpZ2VzYjEyMw==,size_16,color_FFFFFF,t_70.png



條件(jiàn)查詢


e9488440aaec42b2723d050642a3d860_watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L25pc2hpZ2VzYjEyMw==,size_16,color_FFFFFF,t_70.png


修改

93296ac402dde86831fad915fe6f0c46_watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L25pc2hpZ2VzYjEyMw==,size_16,color_FFFFFF,t_70.png



查詢全部(為(wèi)了方便區(qū)分,在這(zhè)個(gè)操作(zuò)前再次點擊了增加)




删除


0416932397da88652cc7988362d443ca_watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L25pc2hpZ2VzYjEyMw==,size_16,color_FFFFFF,t_70.png


查詢全部


193b7c7eaa8e47d437bb63bdac1316bb_20190519182518912.png


ViewUtils

用注解的(de)形式對(duì)一些綁定的(de)代碼進行優化(huà)(隻對(duì)于代碼長(cháng)短而言,實際性能可能反而還(hái)會有(yǒu)所降低(dī))


首先是布局


我們加一個(gè)按鈕和(hé)一個(gè)文(wén)本框


    <Button

        android:layout_width="match_parent"

        android:layout_height="wrap_content"

        android:id="@+id/ViewUtils"

        android:text="ViewUtils"

        app:layout_constraintTop_toBottomOf="@+id/query_all"

        />

    <TextView

        android:layout_width="match_parent"

        android:layout_height="wrap_content"

        android:id="@+id/ViewUtils_text"

        android:text="ViewUtils的(de)文(wén)本"

        android:gravity="center"

        app:layout_constraintTop_toBottomOf="@+id/ViewUtils"

        />


然後是代碼部分


對(duì)于組件(jiàn)的(de)綁定,主要是圖示圈起來(lái)的(de)兩個(gè)部分

1e98134b69a586a787d4114398fb1d1e_watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L25pc2hpZ2VzYjEyMw==,size_16,color_FFFFFF,t_70.png



對(duì)于事(shì)件(jiàn),類似的(de)就可以綁定按鈕,還(hái)可以用“,”隔開(kāi)若幹個(gè)id,即可同時(shí)綁定多個(gè)按鈕


    @OnClick(R.id.ViewUtils)

    public void show(View view){

        textView .setText("ViewUtils的(de)按鈕被按下(xià)");

    }

效果如下(xià)

image.png




手機(jī)掃碼查看(kàn)當前文(wén)章(zhāng):

Android開(kāi)源庫——xUtils框架

如本網轉載稿涉及版權等問(wèn)題,請作(zuò)者見稿後在兩周內(nèi)速來(lái)電(diàn)與我們聯系, 詳見版權聲明(míng)

  上(shàng)一篇:【Android -- 開(kāi)源庫】騰訊 TBS 浏覽器(qì) SDK 接入

 下(xià)一篇:Android -【 開(kāi)源庫】數據庫 Realm 的(de)基本使用