xUtils3 其功能不得不說,簡化了很多的開發步驟,可以說是非常好的開發工具,但是苦於沒有完整的使用手冊,下面是使用中的一些總結,不斷完善。
| xUtils 版本 | 3.3.36 |
| jar包下載地址 | |
| GitHub項目地址 |
使用前配置
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
