xUtils3.0框架學(xué)習(xí)筆記分享
xUtils是開(kāi)速開(kāi)發(fā)安卓項(xiàng)目的開(kāi)源框架,開(kāi)源項(xiàng)目地址:https://github.com/wyouflf/xUtils3。使用起來(lái)非常方便。主要功能包括:
1、xUtils 支持超大文件(超過(guò)2G)上傳,更全面的http請(qǐng)求協(xié)議支持(11種謂詞)。
2、擁有更加靈活的ORM,更多的事件注解支持且不受混淆影響。
3、圖片綁定支持gif(受系統(tǒng)兼容性影響, 部分gif文件只能靜態(tài)顯示), webp; 支持圓角, 圓形, 方形等裁剪, 支持自動(dòng)旋轉(zhuǎn)等。
4、數(shù)據(jù)庫(kù)api簡(jiǎn)化提高性能, 達(dá)到和greenDao一致的性能。
5、HTTP實(shí)現(xiàn)替換HttpClient為UrlConnection, 自動(dòng)解析回調(diào)泛型, 更安全的斷點(diǎn)續(xù)傳策略等。
控件及事件注解綁定,方便高效HTTP請(qǐng)求,簡(jiǎn)單地?cái)?shù)據(jù)庫(kù)操作方式,確實(shí)是一款非常有助于我們快速開(kāi)發(fā)項(xiàng)目的開(kāi)源框架。
參考github上面demo及相關(guān)資料,寫(xiě)了一個(gè)學(xué)習(xí)的demo,分別從注解,圖片,HTTP及數(shù)據(jù)庫(kù)四個(gè)方面進(jìn)行了代碼編寫(xiě)。
首先是在AndroidStudio中配置項(xiàng)目:
第一步:
在AndroidStudio項(xiàng)目的build.gradle文件中添加compile ‘org.xutils:xutils:3.3.36':
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
testCompile 'junit:junit:4.12'
compile 'com.android.support:appcompat-v7:23.4.0'
compile 'org.xutils:xutils:3.3.36'
}
添加好后build下工程即可。
第二步:
在AndroidManifest.xml中添加對(duì)應(yīng)權(quán)限:
<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
第三步:在項(xiàng)目中自定義Application,初始化xUtils3.0。
/**
* description:
* 作者:ldm
* 時(shí)間:20162016/6/22 09:03
* 郵箱:1786911211@qq.com
*/
public class BaseApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
x.Ext.init(this);//在自定義的Application中初始化XUtils3.0
}
}
記得把我們定義的Application配置到AndroidManifest.xml中。
接下來(lái)就可以作用xUtils3.0進(jìn)行快速開(kāi)發(fā)了。
—– 第一部分:注解示例—–
/**
* description:xUtils3.0框架注解功能
* 作者:ldm
* 時(shí)間:20162016/6/22 09:17
* 郵箱:1786911211@qq.com
*/
@ContentView(R.layout.activity_annotation)
public class AnnotationActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
x.view().inject(this);
FragmentManager fragmentManager = getFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
TestFragment fragment = new TestFragment();
fragmentTransaction.add(R.id.fra_layout, fragment);
fragmentTransaction.commit();
}
}
—–注解功能對(duì)應(yīng)地Fragment—–
/**
* description:xUtils3.0框架注解之:Fragment中注解使用
* 作者:ldm
* 時(shí)間:20162016/6/22 09:28
* 郵箱:1786911211@qq.com
*/
@ContentView(R.layout.frag_test)//給Fragment綁定布局文件
public class TestFragment extends Fragment {
@ViewInject(R.id.test_listview)
private ListView listView;
private List<ListBean> datas;
public TestFragment() {
super();
}
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
return x.view().inject(this, inflater, container);//調(diào)用x.view().inject()方法返回view
}
//onCreateView是創(chuàng)建的時(shí)候調(diào)用,onViewCreated是在onCreateView后被觸發(fā)的事件
@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
constructDatas();
listView.setAdapter(new TestAdapter(getActivity(), datas));
}
private void constructDatas() {
datas = new ArrayList<>();
for (int i = 0; i < 15; i++) {
ListBean bean = new ListBean("這是第" + i + "個(gè)標(biāo)題", "這里都是相同的內(nèi)容");
datas.add(bean);
}
}
//ListView的item點(diǎn)擊事件注解操作
@Event(type = AdapterView.OnItemClickListener.class, value = R.id.test_listview)
private void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Toast.makeText(getActivity(), "點(diǎn)擊了第" + position + "個(gè)item", Toast.LENGTH_LONG).show();
}
//長(zhǎng)按事件注解操作
@Event(type = AdapterView.OnItemLongClickListener.class, value = R.id.test_listview)
private boolean onLongItemClick(AdapterView<?> parent, View view, int position, long id) {
Toast.makeText(getActivity(), "長(zhǎng)按第" + position + "個(gè)item", Toast.LENGTH_LONG).show();
return true;
}
}
—–第二部分:圖片加載示例—–
/**
* description:xUtils3.0框架圖片功能
* 作者:ldm
* 時(shí)間:20162016/6/22 09:17
* 郵箱:1786911211@qq.com
*/
@ContentView(R.layout.activity_image)
public class ImageActivity extends Activity {
@ViewInject(R.id.image_01)
private ImageView image_01;
@ViewInject(R.id.image_02)
private ImageView image_02;
@ViewInject(R.id.image_03)
private ImageView image_03;
@ViewInject(R.id.image_04)
private ImageView image_04;
private String url_01 = "";
private String url_02 = "";
private String url_03 = "";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
x.view().inject(this);//需要添加這句代碼,否則不會(huì)關(guān)聯(lián)到布局
}
//加載網(wǎng)絡(luò)圖片第一種方法
@Event(value = R.id.image_01)
private void loadImageMethodOne(View v) {
//直接調(diào)用 bind(ImageView view, String url)方法,傳入對(duì)應(yīng)控件及url即可
x.image().bind(image_01, url_01);
}
//加載網(wǎng)絡(luò)圖片第二種方法
@Event(value = R.id.image_02)
private void loadImageMethodTwo(View v) {
//創(chuàng)建圖片參數(shù)設(shè)置類ImageOptions
ImageOptions options = new ImageOptions.Builder().build();
//直接調(diào)用bind(ImageView view, String url, ImageOptions options)方法,傳入對(duì)應(yīng)參數(shù)
x.image().bind(image_02, url_02, options);
}
//加載網(wǎng)絡(luò)圖片第三種方法
@Event(value = R.id.image_03)
private void loadImageMethodThree(View v) {
//調(diào)用bind(ImageView view, String url, Callback.CommonCallback<Drawable> callback)
x.image().bind(image_03, url_03, new Callback.CacheCallback<Drawable>() {
@Override
public boolean onCache(Drawable result) {//可以在這里設(shè)置圖片保存等操作
return false;
}
@Override
public void onSuccess(Drawable result) {//獲取成功
}
@Override
public void onError(Throwable ex, boolean isOnCallback) {//獲取失敗
}
@Override
public void onCancelled(CancelledException cex) {//取消操作
}
@Override
public void onFinished() {//完成操作
}
});
}
//加載本地圖片
@Event(value = R.id.image_04)
private void loadImageMethodFour(View v) {
ImageOptions options = new ImageOptions.Builder().
setImageScaleType(ImageView.ScaleType.FIT_CENTER).
setUseMemCache(true).
build();//可以設(shè)置options各項(xiàng)參數(shù)
// assets下的圖片
// x.image().bind(image_04, "assets://test.png", options);
// SD卡下圖片
// x.image().bind(image_04, new File("/sdcard/test.png").toURI().toString(), options);
x.image().bind(image_04, "/sdcard/test.gif", options);
}
}
—–第三部分:HTTP請(qǐng)求—–
/**
* description:xUtils框架之Http請(qǐng)求
* 作者:ldm
* 時(shí)間:20162016/6/22 09:17
* 郵箱:1786911211@qq.com
*/
@ContentView(R.layout.activity_http)
public class HttpActivity extends Activity {
@ViewInject(R.id.get)
private Button get;
@ViewInject(R.id.post)
private Button post;
@ViewInject(R.id.upload)
private Button upLoad;
@ViewInject(R.id.download)
private Button downLoad;
private static final String TAG = "HttpActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
x.view().inject(this);
}
//HTTP請(qǐng)求之GET請(qǐng)求
@Event(type = View.OnClickListener.class, value = R.id.get)
private void httpGetOnClick(View v) {
String url = "http://www.baidu.com";
final ProgressDialog dia = new ProgressDialog(this);
dia.setMessage("加載中....");
dia.show();
RequestParams params = new RequestParams(url);
x.http().get(params, new Callback.CommonCallback<String>() {
@Override
public void onSuccess(String result) {
//加載成功回調(diào),返回獲取到的數(shù)據(jù)
Log.i(TAG, "onSuccess: " + result);
}
@Override
public void onFinished() {
dia.dismiss();//加載完成
}
@Override
public void onCancelled(CancelledException cex) {
}
@Override
public void onError(Throwable ex, boolean isOnCallback) {
}
});
}
//HTTP請(qǐng)求之POST請(qǐng)求
@Event(type = View.OnClickListener.class, value = R.id.post)
private void httpPostOnClick(View v) {
String url = "this is request url for post";
final ProgressDialog dia = new ProgressDialog(this);
dia.setMessage("加載中....");
dia.show();
RequestParams params = new RequestParams(url);
params.addParameter("userName", "admin");//添加Post請(qǐng)求參數(shù),如果是get請(qǐng)求,會(huì)直接添加到url后面
params.addBodyParameter("passWord", "123456");
params.addHeader("head", "給Head添加信息");//addHeader添加Head信息
x.http().post(params, new Callback.CommonCallback<String>() {
@Override
public void onSuccess(String result) {
//加載成功回調(diào),返回獲取到的數(shù)據(jù)
Log.i(TAG, "onSuccess: " + result);
}
@Override
public void onFinished() {
dia.dismiss();//加載完成
}
@Override
public void onCancelled(CancelledException cex) {
}
@Override
public void onError(Throwable ex, boolean isOnCallback) {
}
});
}
//HTTP請(qǐng)求之文件上傳
@Event(type = View.OnClickListener.class, value = R.id.upload)
private void upLoadOnClick(View v) {
String upUrl = "/mnt/sdcard/pic/test.jpg";//指定要上傳的文件
final ProgressDialog dia = new ProgressDialog(this);
dia.setMessage("加載中....");
dia.show();
RequestParams params = new RequestParams(upUrl);
params.addBodyParameter("file", new File(upUrl));
x.http().post(params, new Callback.CommonCallback<String>() {
@Override
public void onSuccess(String result) {
//加載成功回調(diào),返回獲取到的數(shù)據(jù)
Log.i(TAG, "onSuccess: " + result);
}
@Override
public void onFinished() {
dia.dismiss();//加載完成
}
@Override
public void onCancelled(CancelledException cex) {
}
@Override
public void onError(Throwable ex, boolean isOnCallback) {
}
});
}
//HTTP請(qǐng)求之文件下載
@Event(type = View.OnClickListener.class, value = R.id.download)
private void downLoadOnClick(View v) {
String downUrl = "please input download url";
final ProgressDialog dia = new ProgressDialog(this);
dia.setMessage("加載中....");
dia.show();
RequestParams params = new RequestParams(downUrl);
x.http().post(params, new Callback.CommonCallback<File>() {
@Override
public void onSuccess(File result) {
//下載成功
Intent in = new Intent(Intent.ACTION_VIEW);
in.setDataAndType(Uri.fromFile(result), "application/vnd.android.package-archive");//比如我們下載的apk文件,直接安裝
startActivity(in);
}
@Override
public void onFinished() {
dia.dismiss();
}
@Override
public void onCancelled(CancelledException cex) {
}
@Override
public void onError(Throwable ex, boolean isOnCallback) {
}
});
}
}
—-第四部分:數(shù)據(jù)庫(kù)操作——
/**
* description:xUtils3.0框架數(shù)據(jù)庫(kù)操作
* 作者:ldm
* 時(shí)間:20162016/6/22 09:17
* 郵箱:1786911211@qq.com
*/
@ContentView(R.layout.activity_db)
public class DatabaseActivity extends Activity {
@ViewInject(R.id.create)
private Button create;
@ViewInject(R.id.add)
private Button add;
@ViewInject(R.id.delete)
private Button delete;
@ViewInject(R.id.query)
private Button query;
@ViewInject(R.id.update)
private Button update;
@ViewInject(R.id.del_db)
private Button del_db;
private DbManager.DaoConfig daoConfig;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
x.view().inject(this);
}
private void initDataBase() {
daoConfig = new DbManager.DaoConfig()
.setDbName("test.db")//數(shù)據(jù)庫(kù)名稱
// 不設(shè)置dbDir時(shí), 默認(rèn)存儲(chǔ)在app的私有目錄.
.setDbDir(new File("/sdcard")) // "sdcard"的寫(xiě)法并非最佳實(shí)踐, 這里為了簡(jiǎn)單, 先這樣寫(xiě)了.
.setDbVersion(2)//設(shè)置版本號(hào)
.setDbOpenListener(new DbManager.DbOpenListener() {
@Override
public void onDbOpened(DbManager db) {
// 開(kāi)啟WAL, 對(duì)寫(xiě)入加速提升巨大
db.getDatabase().enableWriteAheadLogging();
}
})
.setDbUpgradeListener(new DbManager.DbUpgradeListener() {//數(shù)據(jù)庫(kù)升級(jí)
@Override
public void onUpgrade(DbManager db, int oldVersion, int newVersion) {
// TODO: ...
// db.addColumn(...);
// db.dropTable(...);
// ...
// or
// db.dropDb();
}
});
}
//創(chuàng)建數(shù)據(jù)庫(kù)及表格
@Event(value = R.id.create)
private void createOnClick(View v) throws Exception {
initDataBase();
DbManager db = x.getDb(daoConfig);
Teacher t = new Teacher("張三", 28, "English", 1);
db.save(t);//調(diào)用這句話,則可以創(chuàng)建表格,并把數(shù)據(jù)存入
}
//添加數(shù)據(jù)
@Event(value = R.id.add)
private void addOnClick(View v) throws Exception {
DbManager db = x.getDb(daoConfig);
Teacher t = new Teacher("李四", 38, "Math", 3);
db.save(t);//如果表格存在,并把數(shù)據(jù)存入
List<Teacher> list = new ArrayList<>();
list.add(new Teacher("王五", 30, "Engilsh", 2));
list.add(new Teacher("趙六", 40, "Chinese", 3));
list.add(new Teacher("陳七", 50, "Math", 4));
db.save(list);//可以這樣保存多條數(shù)據(jù)到指定表格
}
//刪除數(shù)據(jù)
@Event(value = R.id.delete)
private void deleteOnClick(View v) throws Exception {
DbManager db = x.getDb(daoConfig);
WhereBuilder wb = WhereBuilder.b();
wb.and("level", "=", 1);
db.delete(Teacher.class, wb);//刪除等級(jí)為1的教師
}
//修改數(shù)據(jù)
@Event(value = R.id.update)
private void updateOnClick(View v) throws Exception {
DbManager db = x.getDb(daoConfig);
db.update(Teacher.class, WhereBuilder.b().and("name", "=", "王五"), new KeyValue("name", "朱八"));//把王五的名字改成朱八
}
//查詢數(shù)據(jù)
@Event(value = R.id.query)
private void queryOnClick(View v) throws Exception {
DbManager db = x.getDb(daoConfig);
WhereBuilder wb = WhereBuilder.b();
wb.and("level", "=", 2);
List<Teacher> list = db.selector(Teacher.class).findAll();//查詢所有數(shù)據(jù)
List<Teacher> list1 = db.selector(Teacher.class).where(wb).findAll();//查詢等級(jí)數(shù)2的教師
}
//刪除數(shù)據(jù)庫(kù)或表格
@Event(value = R.id.del_db)
private void delDBOnClick(View v) throws Exception {
DbManager db = x.getDb(daoConfig);
db.dropDb();//刪除數(shù)據(jù)庫(kù)
db.dropTable(Teacher.class);//刪除teacher表格
}
}
由于時(shí)間關(guān)系,代碼寫(xiě)得比較粗糙,后期使用中再細(xì)化。
Demo下載地址:http://xiazai.jb51.net/201611/yuanma/XutilsDemo(jb51.net).rar
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Java常用正則表達(dá)式驗(yàn)證工具類RegexUtils.java
- Android XUtils3框架的基本使用方法(二)
- Android中XUtils3框架使用方法詳解(一)
- Android xUtils更新到3.0后的基本使用規(guī)則詳解
- 用xutils3.0進(jìn)行下載項(xiàng)目更新
- 使用Android的OkHttp包實(shí)現(xiàn)基于HTTP協(xié)議的文件上傳下載
- Android基于Http協(xié)議實(shí)現(xiàn)文件上傳功能的方法
- android文件上傳示例分享(android圖片上傳)
- Android中發(fā)送Http請(qǐng)求(包括文件上傳、servlet接收)的實(shí)例代碼
- Android使用xUtils3.0實(shí)現(xiàn)文件上傳
相關(guān)文章
Android實(shí)現(xiàn)卡片翻轉(zhuǎn)動(dòng)畫(huà)
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)卡片翻轉(zhuǎn)動(dòng)畫(huà),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-01-01
Android開(kāi)發(fā)實(shí)現(xiàn)的獲取sdcard大小及內(nèi)存大小工具類
這篇文章主要介紹了Android開(kāi)發(fā)實(shí)現(xiàn)的獲取sdcard大小及內(nèi)存大小工具類,涉及Android針對(duì)手機(jī)硬件SD卡及內(nèi)存相關(guān)操作技巧,需要的朋友可以參考下2017-11-11
android時(shí)間選擇控件之TimePickerView使用方法詳解
這篇文章主要為大家詳細(xì)介紹了android時(shí)間選擇控件之TimePickerView的使用方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-09-09
Android Activity與Fragment之間的跳轉(zhuǎn)實(shí)例詳解
這篇文章主要介紹了Android Activity與Fragment之間的跳轉(zhuǎn)實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下2017-02-02
Android studio 2020中的Android SDK 下載教程
這篇文章主要介紹了Android studio 2020中的Android SDK 下載教程,本文圖文并茂給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-03-03
android實(shí)現(xiàn)簡(jiǎn)單底部導(dǎo)航欄
這篇文章主要為大家詳細(xì)介紹了android實(shí)現(xiàn)簡(jiǎn)單底部導(dǎo)航欄,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-07-07
Android入門(mén)計(jì)算器編寫(xiě)代碼
這篇文章主要為大家詳細(xì)介紹了Android入門(mén)計(jì)算器編寫(xiě)代碼,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-08-08
Android自定義View實(shí)現(xiàn)字母導(dǎo)航欄的代碼
這篇文章主要介紹了Android自定義View實(shí)現(xiàn)字母導(dǎo)航欄的實(shí)例代碼,代碼簡(jiǎn)單易懂,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2016-09-09
android 中ProgressDialog實(shí)現(xiàn)全屏效果的示例
本篇文章主要介紹了android 中ProgressDialog實(shí)現(xiàn)全屏效果的示例,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-11-11

