Android xUtils3.0使用手冊(一)- 基礎功能使用


xUtils3 其功能不得不說,簡化了很多的開發步驟,可以說是非常好的開發工具,但是苦於沒有完整的使用手冊,下面是使用中的一些總結,不斷完善。

xUtils 版本 3.3.36
jar包下載地址

http://files.cnblogs.com/files/steffen/xUtils-3.3.36.zip

GitHub項目地址

https://github.com/wyouflf/xUtils3

 

 

 

 

 

使用前配置

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

導入文件

方法1:導入jar包文件;

方法2:在gradle中添加依賴:

dependencies {
    compile 'org.xutils:xutils:3.3.44'
}


 

1. xUtils中的IOC框架

使用xUtils的第一步就是先創建自己的Application類,在MyApplication中初始化xUtils,代碼如下:

復制代碼
1 public class MyApplication extends Application {
2     @Override     
3     public void onCreate() {
4         super.onCreate();
5         x.Ext.init(this); //xUtils初始化     
6     } 
7 }
復制代碼

在AndroidManifest.xml的application標簽中添加如下代碼:    

1 android:name=".MyApplication" 

這樣初始化就算完成了。

 

例:下面使用IOC框架的代碼如下:

復制代碼
 1 import org.xutils.view.annotation.ContentView;
 2 import org.xutils.view.annotation.Event;
 3 import org.xutils.view.annotation.ViewInject;
 4 import org.xutils.x;
 5 // 獲取Activity布局
 6 @ContentView(R.layout.activity_main)
 7 public class MainActivity extends Activity {
 8     // 獲取控件ID
 9     @ViewInject(R.id.mybut)
10     private Button mybut;
11 
12     @Override
13     protected void onCreate(Bundle savedInstanceState) {
14         super.onCreate(savedInstanceState);
15         x.view().inject(this); // 初始化x.view(), 否則ID獲取失敗
16     }
17 
18     /** 添加控件監聽事件 */
19     @Event(value = {R.id.mybut, R.id.myradio},type = View.OnClickListener.class)
20     private void onButtonClick(View v){
21         switch (v.getId()) {
22             case R.id.mybut:
23                 Toast.makeText(this,"我是xUtils的IOC功能", Toast.LENGTH_SHORT).show();
24                 break;
25             case R.id.myradio:
26                 break;
27         }
28     }
29 } 
復制代碼

 注釋:監聽事件中,@Event, value后面是 Array,當多個ID時{R.id.btn1, R.id.btn2, R.id.btn3, ···}; 當只有一個ID時可直接寫 value=R.id.btn。

當有多個ID時,要保證后面事件的類型(type)要是一致的,否則要在不同的方法中實現。

另:點擊事件方法名一定要包含onClick或者onEven。

 

2. 網絡請求

RequestParams 參數:

RequestParams params = new RequestParams(url);

.addQueryStringParamter("wd", "xUtils"); // 適用於GET請求方式;類似於字符串拼接 http://xxx/x?wd=xUtils。 

.addBodyParameter("wd", "xUtils"); // 適用於POST請求方式;添加到Body體的參數。

 

2.1 GET/POST請求

    get和post請求並無太大區別,主要區別在於參數的添加方法上。

  GET請求 POST請求
請求參數添加:   .addQueryStringParamter("wd", "xUtils");   .addBodyParameter("wd", "xUtils");
請求的方法(帶緩沖):   x.http().get(params,  new Callback.CommonCallback<String>() { });      x.http().post(params,  new Callback.CommonCallback<String>() { });   
請求的方法(帶緩沖):   x.http().get(params,  new Callback.CacheCallback<String>() { });      x.http().post(params,  new Callback.CacheCallback<String>() { });   

 

 

 

2.1.1 無緩存請求(以post為例)

復制代碼
 1 RequestParams params = new RequestParams("http://xxx.com/xx");
 2 x.http().post(params,  new Callback.CommonCallback<String>() { 
 3         @Override
 4         public void onSuccess(String result) {
 5             // 請求成功后,返回結果
 6         }
 7         @Override     
 8         public void onError(Throwable ex, boolean isOnCallback) {
 9             // 請求失敗后返回結果
10             if (!isNetworkConnections() || ex instanceof HttpException) {
11                 // 網絡錯誤
12             } else {
13                 // 其他請求錯誤
14         }
15         @Override     
16         public void onCancelled(Callback.CancelledException cex) {
17             // 中斷請求
18         }
19         @Override     
20         public void onFinished() {
21             // 請求結束(必調用)
22         } 
23     }
24 );
25 /**
26  * @return 網絡是否連接 true:有網絡,false:無網絡
27  */
28 private boolean isNetworkConnections() {
29     ConnectivityManager con = (ConnectivityManager) x.app().getSystemService(Context.CONNECTIVITY_SERVICE);
30     boolean wifi = con.getNetworkInfo(ConnectivityManager.TYPE_WIFI).isConnected();
31     boolean internet = con.getNetworkInfo(ConnectivityManager.TYPE_MOBILE).isConnected();
32     return (wifi || internet);
33 }
復制代碼

 

2.1.2 有緩存請求(以POST為例)

復制代碼
 1 RequestParams params = new RequestParams("http://xxx.com/xx");
 2 x.http().post(params,  new Callback.CacheCallback<String>() { 
 3         @Override
 4         public void onSuccess(String result) {
 5             // 請求成功后,返回結果
 6         }
 7         @Override
 8         public boolean onCache(String result) {
 9             // 此方法為本地加載回調方法,本地沒有數據則不會調用此方法
10             // @param result 緩存中得到的數據
11             // @return true 如果緩存中有數據就不再進行網絡請求
12             // false 得到緩存數據后仍進行網絡請求
13             return ture;
14         }
15         @Override     
16         public void onError(Throwable ex, boolean isOnCallback) {
17             // 請求失敗后返回結果
18             if (!isNetworkConnections() || ex instanceof HttpException) {
19                 // 網絡錯誤
20             } else {
21                 // 其他請求錯誤
22         }
23         @Override     
24         public void onCancelled(Callback.CancelledException cex) {
25             // 中斷請求
26         }
27         @Override     
28         public void onFinished() {
29             // 請求結束(必調用)
30         } 
31     }
32 );    
復制代碼


 

3. 圖片加載

3.1 普通圖片加載

最簡單的加載方式:

x.image().bind(image, "http://pic6.nipic.com/20100418/4581549_084724004690_2.jpg");

當然我們也可以設置一些屬性:

復制代碼
1 ImageOptions imageOptions = new ImageOptions.Builder()
2                     .setSize(120, 120)
3                     .setRadius(DensityUtil.dip2px(5))
4                     .setCrop(true)
5                     .setImageScaleType(ImageView.ScaleType.CENTER_CROP)
6                     .setLoadingDrawableId(R.mipmap.ic_launcher)
7                     .setFailureDrawableId(R.mipmap.ic_launcher)
8                     .build(); 
9 x.image().bind(image, "http://pic6.nipic.com/20100418/4581549_084724004690_2.jpg",imageOptions);
復制代碼

 

3.2 圓形圖片加載

復制代碼
ImageOptions options = new ImageOptions.Builder()
                .setLoadingDrawableId(R.mipmap.ic_launcher)
                .setFailureDrawableId(R.mipmap.ic_launcher)
                .setUseMemCache(true)
                .setCircular(true) // 設置成圓形圖片
                .setFadeIn(true) //淡入效果
                .setImageScaleType(ImageView.ScaleType.FIT_CENTER)
                .build();
復制代碼

 注:圓形圖片加載options的設置對本地圖片無效。

3.3 GIF圖片加載

復制代碼
ImageOptions options = new ImageOptions.Builder()
                .setLoadingDrawableId(R.mipmap.ic_launcher)
                .setFailureDrawableId(R.mipmap.ic_launcher)
                .setUseMemCache(true)
                .setIgnoreGif(true) // 允許加載GIF圖片
                .setFadeIn(true) //淡入效果
                .setImageScaleType(ImageView.ScaleType.FIT_CENTER)
                .build();
復制代碼

3.4 ImageOptions屬性

.setFadeIn(true); //淡入效果

.setCircular(true); //設置圖片顯示為圓形

.setSquare(true); //設置圖片顯示為正方形

.setCrop(true).setSize(200,200); //設置大小

.setAnimation(animation); //設置動畫

.setFailureDrawable(Drawable failureDrawable); //設置加載失敗的動畫

.setFailureDrawableId(int failureDrawable); //以資源id設置加載失敗的動畫

.setLoadingDrawable(Drawable loadingDrawable); //設置加載中的動畫

.setLoadingDrawableId(int loadingDrawable); //以資源id設置加載中的動畫

.setIgnoreGif(false); //忽略Gif圖片

.setParamsBuilder(ParamsBuilder paramsBuilder); //在網絡請求中添加一些參數

.setRaduis(int raduis); //設置拐角弧度

.setUseMemCache(true); //設置使用MemCache,默認true

 

4. 相關資料

☞  Android xUtils3.0使用手冊(二) - 數據庫操作

Android xUtils3.0使用手冊(二) - 數據庫操作

步驟: 

(1). 創建數據表;

(2). DaoConfig 獲取數據庫的配置信息;

(3).  獲取數據庫實例:  x.getDb(daoConfig);  

(4). 數據庫的增刪改查。

 

1. 創建數據表

    在這里要強調的是,數據庫里面表的創建的時間,只有在你對數據庫里面的操作涉及到這張表的操作時,會先判斷當前的表是否存在,如果不存在,才會創建一張表,如果存在,才會進行相應的CRUD操作。

復制代碼
 1 @Table(name = "person") 
 2 public class person {
 3     @Column(name = "ID", isId = true, autoGen = true)
 4     public int id;
 5     @Column(name = "NAME")
 6     public String name; // 姓名
 7     @Column(name = "AGE")
 8     public int age; // 年齡
 9     @Column(name = "SEX")
10     public String sex; // 性別
11
12 @Override
13 public String toString() { 14 return "person [id=" + id + ", name=" + name + ", age=" + age + ", sex=" + sex + "]"; 15 }
16 }
復制代碼

上表中包含了db相關注解:

復制代碼
 1 @Check     check約束
 2 @Column    列名
 3 @Finder    一對多、多對一、多對多關系(見sample的Parent、Child中的使用)    
 4 @Foreign   外鍵
 5 @Id        主鍵,當為int類型時,默認自增。 非自增時,需要設置id的值
 6 @NoAutoIncrement  不自增
 7 @NotNull  不為空
 8 @Table    表名
 9 @Transient  不寫入數據庫表結構
10 @Unique     唯一約束
復制代碼

注解屬性

name (String)       :  表名稱    
isId (boolean)      :  是否為主鍵
autoGen (boolean)   :  是否自增(默認: false)
proprety (String)   :  是否為空(默認: NOT NULL) 

 

2. DaoConfig 獲取數據庫的配置信息

復制代碼
 1 //本地數據的初始化
 2 DbManager.DaoConfig daoConfig = new DbManager.DaoConfig()
 3         .setDbName("my_db.db") //設置數據庫名
 4         .setDbVersion(1) //設置數據庫版本,每次啟動應用時將會檢查該版本號,
 5         // 發現數據庫版本低於這里設置的值將進行數據庫升級並觸發DbUpgradeListener
 6         .setAllowTransaction(true) //設置是否開啟事務,默認為false關閉事務
 7         .setTableCreateListener(new DbManager.TableCreateListener() {
 8                 @Override
 9                 public void onTableCreated(DbManager dbManager, TableEntity<?> tableEntity) {
10                 }
11         })
12         .setDbOpenListener(new DbManager.DbOpenListener() {
13                 @Override
14                 public void onDbOpened(DbManager db) {
15                     // 開啟WAL, 對寫入加速提升巨大
16                     db.getDatabase().enableWriteAheadLogging();
17                 }
18         })
19         // 設置數據庫創建時的Listener
20         .setDbUpgradeListener(new DbManager.DbUpgradeListener() {
21                 @Override
22                 public void onUpgrade(DbManager db, int oldVersion, int newVersion) {
23                     // TODO: ...
24                     // db.addColumn(...);
25                     // db.dropTable(...);
26                     // ...
27                     // or
28                     // db.dropDb();
29                 }
30         }); //設置數據庫升級時的Listener,這里可以執行相關數據庫表的相關修改,比如alter語句增加字段等
31         // .setDbDir(null);//設置數據庫.db文件存放的目錄,默認為包名下databases目錄下
32             
33 DBManager db = x.getDb(daoConfig);
復制代碼

 

3. 獲取數據庫實例

DbManager db = x.getDb(daoConfig);

 

4. 表 操作

通過DbManager這類我們可以做如下操作:

復制代碼
.getDaoConfig  // 獲取數據庫的配置信息
.getDatabase   // 獲取數據庫實例  
.replace       // 只有存在唯一索引時才有用 (慎重)
.dropTable     // 刪除表 
.addColumn     // 添加一列 
.dropDb        // 刪除數據庫
復制代碼


5. 增 操作

復制代碼
1 try {
2     List<person> list = new ArrayList<person>();
3     // ... 加載數據
4 
5     db.save(list); // 保存實體類或者實體類的List到數據庫
6     db.saveOrUpdate(list); // 保存或更新實體類或者實體類的List到數據庫,根據id對應的數據是否存在
7     db.saveBindingId(list); // 保存實體類或實體類的List到數據庫,如果該類型的id是自動生成的,則保存完后會給id賦值
8 } catch (DbException e) {
9 }
復制代碼

 

6. 刪 操作

復制代碼
1 try {
2     db.delete(person.class);//該方法是刪除表中的全部數據
3     db.deleteById(person.class, 12);//該方法主要是根據表的主鍵(id)進行單條記錄的刪除
4     db.delete(person.class, WhereBuilder.b("age", ">", "20"));//根據where語句的條件進行刪除操作 
5     List<person> findAll = db.selector(person.class).expr("age > 20").findAll();
6     db.delete(findAll);//根據實體bean進行對表里面的一條或多條數據進行刪除   
7 } catch (DbException e) {
8 }
復制代碼

 

7. 改 操作

復制代碼
 1 // 第一種
 2 try {
 3     List<Person> findAll = db.findAll(Person.class);
 4     for (Person person : findAll) {
 5         person.setAge(10);
 6     }
 7     db.update(findAll, "age"); //可以使對象、集合
 8 } catch (DbException e) {
 9 }
10 // 第二種
11 try {
12     PersonTable person = db.findById(Person.class, 1);
13     person.setAge(25);
14     db.update(person, "age");
15 } catch(DbException e){
16 }
復制代碼

 

8. 查 操作

復制代碼
 1 try {
 2     db.findById(person.class, 1);//通過主鍵的值來進行查找表里面的數據
 3     db.findFirst(person.class);//返回當前表里面的第一條數據 
 4     List<person> findAll = db.findAll(person.class);//返回當前表里面的所有數據 
 5     db.findDbModelAll(new SqlInfo("select * from person where age > 25"));
 6     DbModel model = db.findDbModelFirst(new SqlInfo("select * from person where age > 25"));
 7     model.getString("age");//model相當於游標
 8     List<person> findAll2 = db.selector(person.class).expr("age >10").findAll();//主要是用來進行一些特定條件的查找
 9 } catch (DbException e) {
10 }
復制代碼

 

9. 相關資料

 

四、網絡請求

由於Android6.0版本之后將HttpClient替換為UrlConnection,所以修改老項目的時候一定要注意。
這里我們簡單封裝一下, 請求參數通過map傳過來,然后通過回調返回請求結果。

/** * @author nelson */ public class c { private static final String BASE_URL = "http://10.168.11.11/"; public static void get(String url, Map<String, Object> parms, final GetDataCallback callback) { RequestParams params = new RequestParams(GetDataTask.BASE_URL + url); if(parms!=null){ for (String key : parms.keySet()) { params.addParameter(key, parms.get(key)); } } x.http().get(params, new Callback.CommonCallback<String>() { @Override public void onSuccess(String result) { callback.success(result); } @Override public void onError(Throwable ex, boolean isOnCallback) { callback.failed(); } @Override public void onCancelled(CancelledException cex) {} @Override public void onFinished() {} }); } public static void post(String url, Map<String, Object> parms, final GetDataCallback callback) { RequestParams params = new RequestParams(GetDataTask.BASE_URL + url); if(parms!=null){ for (String key : parms.keySet()) { params.addParameter(key, parms.get(key)); } } x.http().post(params, new Callback.CommonCallback<String>() { @Override public void onSuccess(String result) { if(callback!=null){ callback.success(result); } } @Override public void onError(Throwable ex, boolean isOnCallback) { if(callback!=null){ callback.failed(); } } @Override public void onCancelled(CancelledException cex) {} @Override public void onFinished() {} }); } /**上傳文件*/ public static void uplodFile(List<String> path, Map<String, Object> map, final GetDataCallback callback) { RequestParams params = new RequestParams(GetDataTask.BASE_URL+"upload"); params.setMultipart(true); for (String key : map.keySet()) { params.addBodyParameter(key, map.get(key).toString()); } for (int i = 0; i < path.size(); i++) { params.addBodyParameter("uploadfile" + i, new File(path.get(i))); } x.http().post(params, new Callback.CommonCallback<String>() { @Override public void onSuccess(String result) { callback.success(result); } @Override public void onError(Throwable ex, boolean isOnCallback) { callback.failed(); } @Override public void onCancelled(CancelledException cex) {} @Override public void onFinished() {} }); } /**回調接口*/ public interface GetDataCallback { void success(String result); void failed(String... args); } }


發起網絡請求
Map<String,Object> map = new HashMap<>(); map.put("pageNumber",page); map.put("typeid",typeid); //如果請求不需要參數,傳null // GetDataTask.post("app/types", null, new GetDataTask.GetDataCallback(){} GetDataTask.post("app/types", map, new GetDataTask.GetDataCallback() { @Override public void success(String response) { Gson gson = new Gson(); //后台返回來的json格式,其他格式自己處理 Result result = gson.fromJson(response, Result.class); } @Override public void failed(String... args) { } });


五、綁定圖片

//通過ImageOptions.Builder().set方法設置圖片的屬性 ImageOptions imageOptions= new ImageOptions.Builder().setFadeIn(true).build(); //淡入效果 //ImageOptions.Builder()的一些其他屬性: .setCircular(true) //設置圖片顯示為圓形 .setSquare(true) //設置圖片顯示為正方形 .setCrop(true).setSize(200,200) //設置大小 .setAnimation(animation) //設置動畫 .setFailureDrawable(Drawable failureDrawable) //設置加載失敗的動畫 .setFailureDrawableId(int failureDrawable) //以資源id設置加載失敗的動畫 .setLoadingDrawable(Drawable loadingDrawable) //設置加載中的動畫 .setLoadingDrawableId(int loadingDrawable) //以資源id設置加載中的動畫 .setIgnoreGif(false) //忽略Gif圖片 .setParamsBuilder(ParamsBuilder paramsBuilder) //在網絡請求中添加一些參數 .setRaduis(int raduis) //設置拐角弧度 .setUseMemCache(true) //設置使用MemCache,默認true x.image().bind(imageView, url, imageOptions); // assets file x.image().bind(imageView, "assets://test.gif", imageOptions); // local file x.image().bind(imageView, new File("/sdcard/test.gif").toURI().toString(), imageOptions); x.image().bind(imageView, "/sdcard/test.gif", imageOptions); x.image().bind(imageView, "file:///sdcard/test.gif", imageOptions); x.image().bind(imageView, "file:/sdcard/test.gif", imageOptions); x.image().bind(imageView, url, imageOptions, new Callback.CommonCallback<Drawable>() { @Override public void onSuccess(Drawable result) { } @Override public void onError(Throwable ex, boolean isOnCallback) { } @Override public void onCancelled(CancelledException cex) { } @Override public void onFinished() { } x.image().loadDrawable(url, imageOptions, new Callback.CommonCallback<Drawable>() {...}); // 用來獲取緩存文件 x.image().loadFile(url, imageOptions, new Callback.CommonCallback<File>() {...}); 

 

六、異步執行任務

x.task().run(new Runnable() { @Override public void run() { //異步任務 } });

x.task().post(new Runnable() { @Override public void run() { //同步代碼 } });

七、ORM 數據庫操作

 

DbManager.DaoConfig daoConfig = new DbManager.DaoConfig() //設置數據庫名,默認xutils.db .setDbName("myapp.db") //設置數據庫路徑,默認存儲在app的私有目錄 .setDbDir(new File("/mnt/sdcard/")) //設置數據庫的版本號 .setDbVersion(2) //設置數據庫打開的監聽 .setDbOpenListener(new DbManager.DbOpenListener() { @Override public void onDbOpened(DbManager db) { //開啟數據庫支持多線程操作,提升性能,對寫入加速提升巨大 db.getDatabase().enableWriteAheadLogging(); } }) //設置數據庫更新的監聽 .setDbUpgradeListener(new DbManager.DbUpgradeListener() { @Override public void onUpgrade(DbManager db, int oldVersion, int newVersion) { } }) //設置表創建的監聽 .setTableCreateListener(new DbManager.TableCreateListener() { @Override public void onTableCreated(DbManager db, TableEntity<?> table){ Log.i("JAVA", "onTableCreated:" + table.getName()); } });

操作數據庫
// User類在最底下 DbManager db = x.getDb(daoConfig); db.dropDb(); // 刪除數據庫 db.dropTable(User.class); // 刪除表 db.save(new User("nelson")); //新增數據 db.delete(User.class); //mtb_user表中數據將被全部刪除 //條件刪除: WhereBuilder b = WhereBuilder.b(); b.and("id",">",2); //構造修改的條件 b.and("id","<",4); db.delete(User.class, b);

修改數據
//第一種寫法: ChildInfo first = db.findFirst(ChildInfo.class); first.setcName("zhansan2"); db.update(first,"c_name"); //c_name:表中的字段名 //第二種寫法: WhereBuilder b = WhereBuilder.b(); b.and("id","=",first.getId()); //構造修改的條件 KeyValue name = new KeyValue("c_name","zhansan3"); db.update(ChildInfo.class,b,name); //第三種寫法: first.setcName("zhansan4"); db.saveOrUpdate(first);

條件查詢
Parent test = db.selector(Parent.class).where("id", "in", new int[]{1, 3, 6}).findFirst(); long count = db.selector(Parent.class).where("name", "LIKE", "w%").and("age", ">", 32).count(); List<Parent> testList = db.selector(Parent.class).where("id", "between", new String[]{"1", "5"}).findAll();



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM