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)按順序執行)
增加
條件(jiàn)查詢
修改
查詢全部(為(wèi)了方便區(qū)分,在這(zhè)個(gè)操作(zuò)前再次點擊了增加)
删除
查詢全部
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è)部分
對(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à)
手機(jī)掃碼查看(kàn)當前文(wén)章(zhāng):