Android中XUtils3框架使用方法詳解(一)
xUtils簡介
xUtils 包含了很多實用的android工具。
xUtils 支持大文件上傳,更全面的http請求協(xié)議支持(10種謂詞),擁有更加靈活的ORM,更多的事件注解支持且不受混淆影響...
xUitls 最低兼容android 2.2 (api level 8)
今天給大家?guī)鞽Utils3的基本介紹,本文章的案例都是基于XUtils3的API語法進(jìn)行的演示。相信大家對這個框架也都了解過,
下面簡單介紹下XUtils3的一些基本知識。
XUtils3一共有4大功能:注解模塊,網(wǎng)絡(luò)模塊,圖片加載模塊,數(shù)據(jù)庫模塊。
使用XUtils只需要在libs文件夾里面加入一個jar包,如果對服務(wù)器返回的數(shù)據(jù)進(jìn)行封裝的話,還需要導(dǎo)入一個Gson的jar包。
<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
注解模塊
Activity的注解
1.在Application的oncreate方法中加入下面代碼:
x.Ext.init(this);
2.在Activity的oncreate方法中加入下面代碼:
x.view().inject(this);
3.加載當(dāng)前的Activity布局需要如下注解:
@ContentView加入到Activity的上方
4.給View進(jìn)行初始化需要如下注解:
@InjectView
5.處理控件的各種響應(yīng)事件需要如下注解:
@Envent
@ContentView(R.layout.activity_main)
public class MainActivity extends ActionBarActivity {
@ViewInject(R.id.btn_get)
Button btn_get;
@ViewInject(R.id.btn_post)
Button btn_post;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
x.view().inject(this);
btn_get.setText("發(fā)送get請求");
btn_post.setText("發(fā)送post請求");
}
//等同于@Event(value={R.id.btn_get,R.id.btn_post},type=View.OnClickListener.class)
@Event(value={R.id.btn_get,R.id.btn_post})
private void getEvent(View view){
switch(view.getId()){
case R.id.btn_get:
Toast.makeText(MainActivity.this, btn_get.getText().toString().trim(), 0).show();
break;
case R.id.btn_post:
Toast.makeText(MainActivity.this, btn_post.getText().toString().trim(), 0).show();
break;
}
}
通過測試,我們發(fā)現(xiàn)當(dāng)點擊btn_get按鈕時,彈出了“發(fā)送get請求”的效果。到這里,大家算是對XUtils的注解有個一個基本的認(rèn)識,下面我在強(qiáng)調(diào)一點的是,@Event這個注解默認(rèn)情況下type屬性為View.OnClickListener.class.如果你想實現(xiàn)其余點擊事件效果,只需要把type值進(jìn)行修改即可。
另外需要注意的一點是按鈕的點擊事件必須用private進(jìn)行修飾。
Fragment的注解:
@ContentView(R.layout.fragment_first)
public class FirstFragment extends Fragment{
private MyAdapter adapter;
private List<Person> list=new ArrayList<>();
private List<String> listUrl=new ArrayList<>();
private List<String> listName=new ArrayList<>();
@ViewInject(R.id.btn_test)
Button btn_test;
@ViewInject(R.id.listView)
ListView listView;
@Override
public View onCreateView(LayoutInflater inflater,
@Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
return x.view().inject(this, inflater, container);
}
ViewHolder的注解:
public class MyAdapter extends BaseAdapter{
private Context context;
private List<Person> list;
private LayoutInflater mInflater;
private ImageOptions options;
public ViewHolder holder;
public MyAdapter(Context context, List<Person> list) {
this.context = context;
this.list = list;
this.mInflater=LayoutInflater.from(context);
options=new ImageOptions.Builder().setLoadingDrawableId(R.drawable.ic_launcher)
.setLoadingDrawableId(R.drawable.ic_launcher).setUseMemCache(true).setCircular(true).build();
}
@Override
public int getCount() {
return list.size();
}
@Override
public Object getItem(int position) {
return list.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
holder=null;
if(convertView==null){
convertView=mInflater.inflate(R.layout.itemone, null);
holder=new ViewHolder();
x.view().inject(holder,convertView);
convertView.setTag(holder);
}
else{
holder=(ViewHolder) convertView.getTag();
}
Person bean=list.get(position);
holder.tv_name.setText(bean.getName());
x.image().bind(holder.iv_image, bean.getImgUrl(), options);
return convertView;
}
class ViewHolder{
@ViewInject(R.id.tv_name)
private TextView tv_name;
@ViewInject(R.id.iv_image)
private ImageView iv_image;
}
上面的代碼是注解ViewHolder的標(biāo)準(zhǔn)模式,相信大家完全能夠看明白。這里我加載圖片使用到了XUtils3的加載網(wǎng)絡(luò)圖片的方法。后面我會詳細(xì)進(jìn)行講解。
網(wǎng)絡(luò)模塊
XUtils的網(wǎng)絡(luò)請求方法和一些網(wǎng)絡(luò)請求框架的用法非常類似,我進(jìn)行了一些簡單的封裝。
封裝一共有3個文件,分別是網(wǎng)絡(luò)請求工具類XUtil,請求響應(yīng)數(shù)據(jù)的解析類,還有一個就是一個請求成功的一個接口回調(diào)類。
代碼如下:
public class XUtil {
/**
* 發(fā)送get請求
* @param <T>
*/
public static <T> Cancelable Get(String url,Map<String,String> map,CommonCallback<T> callback){
RequestParams params=new RequestParams(url);
if(null!=map){
for(Map.Entry<String, String> entry : map.entrySet()){
params.addQueryStringParameter(entry.getKey(), entry.getValue());
}
}
Cancelable cancelable = x.http().get(params, callback);
return cancelable;
}
/**
* 發(fā)送post請求
* @param <T>
*/
public static <T> Cancelable Post(String url,Map<String,Object> map,CommonCallback<T> callback){
RequestParams params=new RequestParams(url);
if(null!=map){
for(Map.Entry<String, Object> entry : map.entrySet()){
params.addParameter(entry.getKey(), entry.getValue());
}
}
Cancelable cancelable = x.http().post(params, callback);
return cancelable;
}
/**
* 上傳文件
* @param <T>
*/
public static <T> Cancelable UpLoadFile(String url,Map<String,Object> map,CommonCallback<T> callback){
RequestParams params=new RequestParams(url);
if(null!=map){
for(Map.Entry<String, Object> entry : map.entrySet()){
params.addParameter(entry.getKey(), entry.getValue());
}
}
params.setMultipart(true);
Cancelable cancelable = x.http().get(params, callback);
return cancelable;
}
/**
* 下載文件
* @param <T>
*/
public static <T> Cancelable DownLoadFile(String url,String filepath,CommonCallback<T> callback){
RequestParams params=new RequestParams(url);
//設(shè)置斷點續(xù)傳
params.setAutoResume(true);
params.setSaveFilePath(filepath);
Cancelable cancelable = x.http().get(params, callback);
return cancelable;
}
}
public class JsonResponseParser implements ResponseParser {
//檢查服務(wù)器返回的響應(yīng)頭信息
@Override
public void checkResponse(UriRequest request) throws Throwable {
}
/**
* 轉(zhuǎn)換result為resultType類型的對象
*
* @param resultType 返回值類型(可能帶有泛型信息)
* @param resultClass 返回值類型
* @param result 字符串?dāng)?shù)據(jù)
* @return
* @throws Throwable
*/
@Override
public Object parse(Type resultType, Class<?> resultClass, String result) throws Throwable {
return new Gson().fromJson(result, resultClass);
}
}
public class MyCallBack<ResultType> implements Callback.CommonCallback<ResultType>{
@Override
public void onSuccess(ResultType result) {
//可以根據(jù)公司的需求進(jìn)行統(tǒng)一的請求成功的邏輯處理
}
@Override
public void onError(Throwable ex, boolean isOnCallback) {
//可以根據(jù)公司的需求進(jìn)行統(tǒng)一的請求網(wǎng)絡(luò)失敗的邏輯處理
}
@Override
public void onCancelled(CancelledException cex) {
}
@Override
public void onFinished() {
}
}
1.發(fā)送get請求示例:
//本get請求來自于免費測試接口:http://www.k780.com/api/entry.baidu
String url="http://api.k780.com:88/?app=idcard.get";
Map<String,String> map=new HashMap<>();
map.put("appkey", "10003");
map.put("sign", "b59bc3ef6191eb9f747dd4e83c99f2a4");
map.put("format", "json");
map.put("idcard", "110101199001011114");
XUtil.Get(url, map, new MyCallBack<PersonInfoBean>(){
@Override
public void onSuccess(PersonInfoBean result) {
super.onSuccess(result);
Log.e("result", result.toString());
}
@Override
public void onError(Throwable ex, boolean isOnCallback) {
super.onError(ex, isOnCallback);
}
});
2.發(fā)送post請求
String url="http://api.k780.com:88/?app=idcard.get";
Map<String,Object> map=new HashMap<>();
map.put("appkey", "10003");
map.put("sign", "b59bc3ef6191eb9f747dd4e83c99f2a4");
map.put("format", "json");
map.put("idcard", "110101199001011114");
XUtil.Post(url, map, new MyCallBack<PersonInfoBean>(){
@Override
public void onSuccess(PersonInfoBean result) {
super.onSuccess(result);
Log.e("result", result.toString());
}
@Override
public void onError(Throwable ex, boolean isOnCallback) {
super.onError(ex, isOnCallback);
}
});
3.上傳文件
/**
* 上傳文件(支持多文件上傳)
*/
private void uploadfile() {
//圖片上傳地址
String url="";
Map<String,Object> map=new HashMap<>();
//傳入自己的相應(yīng)參數(shù)
//map.put(key, value);
//map.put(key, value);
XUtil.UpLoadFile(url, map, new MyCallBack<String>(){
@Override
public void onSuccess(String result) {
super.onSuccess(result);
}
@Override
public void onError(Throwable ex, boolean isOnCallback) {
super.onError(ex, isOnCallback);
}
});
}
4.下載文件
private void downloadfile() {
//文件下載地址
String url="";
//文件保存在本地的路徑
String filepath="";
XUtil.DownLoadFile(url, filepath,new MyCallBack<File>(){
@Override
public void onSuccess(File result) {
super.onSuccess(result);
}
@Override
public void onError(Throwable ex, boolean isOnCallback) {
super.onError(ex, isOnCallback);
}
});
5.下載文件帶進(jìn)度條
private void downloadprogressfile() {
//文件下載地址
String url="";
//文件保存在本地的路徑
String filepath="";
XUtil.DownLoadFile(url, filepath,new MyProgressCallBack<File>(){
@Override
public void onSuccess(File result) {
super.onSuccess(result);
}
@Override
public void onError(Throwable ex, boolean isOnCallback) {
super.onError(ex, isOnCallback);
}
@Override
public void onLoading(long total, long current,
boolean isDownloading) {
super.onLoading(total, current, isDownloading);
}
});
}
6.發(fā)送get請求(服務(wù)器以xml格式返回)
private void getxml() {
String url="http://flash.weather.com.cn/wmaps/xml/china.xml";
XUtil.Get(url, null, new MyCallBack<String>(){
@Override
public void onSuccess(String xmlString) {
super.onSuccess(xmlString);
try{
XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
XmlPullParser xmlPullParser = factory.newPullParser();
xmlPullParser.setInput(new StringReader(xmlString));
int eventType = xmlPullParser.getEventType();
while (eventType != XmlPullParser.END_DOCUMENT) {
switch (eventType) {
case XmlPullParser.START_TAG:
String nodeName = xmlPullParser.getName();
if ("city".equals(nodeName)) {
String pName = xmlPullParser.getAttributeValue(0);
Log.e("TAG", "city is " + pName);
}
break;
}
eventType = xmlPullParser.next();
}
}catch(Exception e){
e.printStackTrace();
}
}
@Override
public void onError(Throwable ex, boolean isOnCallback) {
super.onError(ex, isOnCallback);
}
});
}
圖片加載模塊
用法:
x.image().bind(imageView, url, imageOptions);
x.image().bind(imageView, "file:///sdcard/test.gif", imageOptions);
x.image().bind(imageView, "assets://test.gif", imageOptions);
x.image().bind(imageView, url, imageOptions, new Callback.CommonCallback<Drawable>() {...});
x.image().loadDrawable(url, imageOptions, new Callback.CommonCallback<Drawable>() {...});
x.image().loadFile(url, imageOptions, new Callback.CommonCallback<File>() {...});
Xutils3的api還是比較簡單的,相信大家都可以看懂,第一個參數(shù)傳入一個View,第二個參數(shù)傳入一個圖片的網(wǎng)絡(luò)地址,第三個參數(shù)一般是加載圖片的配置。
下面看一下ImageOptions這個類吧:
ImageOptions options=new ImageOptions.Builder() //設(shè)置加載過程中的圖片 .setLoadingDrawableId(R.drawable.ic_launcher) //設(shè)置加載失敗后的圖片 .setFailureDrawableId(R.drawable.ic_launcher) //設(shè)置使用緩存 .setUseMemCache(true) //設(shè)置顯示圓形圖片 .setCircular(true) //設(shè)置支持gif .setIgnoreGif(false) .build();
其余的一些配置請參考源碼
如果需要對加載的圖片進(jìn)行操作的話,可以使用:
x.image().loadDrawable(url, imageOptions, new Callback.CommonCallback<Drawable>() {...});
通過返回的Drawable對象進(jìn)行圖片的處理,滿足項目的個性化的要求.
說了這么多,我想大家至少會對XUtils3有了一個基本的了解,由于XUtils3的數(shù)據(jù)庫的用法比較多,本篇文章不會去涉及,下一篇文章我會為大家詳細(xì)講解XUtils3的數(shù)據(jù)庫模塊。大家趕緊現(xiàn)在動手操作一下吧!本文涉及到的所有實例都會在下面的demo中有涉及到,請自行參考。
相關(guān)閱讀:
Android xUtils更新到3.0后的基本使用規(guī)則詳解
以上所述是小編給大家介紹的Android中XUtils3框架使用方法詳解(一),希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
相關(guān)文章
Android菜單的定義及ActionBar的實現(xiàn)
本篇文章主要介紹了Android菜單的定義及ActionBar的實現(xiàn),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-08-08
Android 監(jiān)聽apk安裝替換卸載廣播的實現(xiàn)代碼
以下代碼實現(xiàn)比較簡單,根據(jù)接收到的Action來判斷應(yīng)用程序是安裝 卸載還是被替換成其他版本,需要的朋友可以參考下2013-07-07
為Android的apk應(yīng)用程序文件加殼以防止反編譯的教程
這篇文章主要介紹了為Android的apk應(yīng)用程序文件加殼以防止反編譯的教程,同時對apk程序的解殼操作也有詳細(xì)講解,需要的朋友可以參考下2016-04-04
Android通過AlarmManager類實現(xiàn)簡單鬧鐘功能
這篇文章主要為大家詳細(xì)介紹了Android通過AlarmManager類實現(xiàn)簡單鬧鐘功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-06-06
從源碼編譯Android系統(tǒng)的Java類庫和JNI動態(tài)庫的方法
這篇文章主要介紹了從源碼編譯Android系統(tǒng)的Java類庫和JNI動態(tài)庫的方法,例子基于Linux系統(tǒng)環(huán)境下來講,需要的朋友可以參考下2016-02-02
Android性能優(yōu)化之利用強(qiáng)大的LeakCanary檢測內(nèi)存泄漏及解決辦法
本篇文章主要介紹了Android性能優(yōu)化之利用LeakCanary檢測內(nèi)存泄漏及解決辦法,有興趣的同學(xué)可以了解一下。2016-11-11

