Android中XUtils3框架使用方法詳解(一)
xUtils簡(jiǎn)介
xUtils 包含了很多實(shí)用的android工具。
xUtils 支持大文件上傳,更全面的http請(qǐng)求協(xié)議支持(10種謂詞),擁有更加靈活的ORM,更多的事件注解支持且不受混淆影響...
xUitls 最低兼容android 2.2 (api level 8)
今天給大家?guī)?lái)XUtils3的基本介紹,本文章的案例都是基于XUtils3的API語(yǔ)法進(jìn)行的演示。相信大家對(duì)這個(gè)框架也都了解過(guò),
下面簡(jiǎn)單介紹下XUtils3的一些基本知識(shí)。
XUtils3一共有4大功能:注解模塊,網(wǎng)絡(luò)模塊,圖片加載模塊,數(shù)據(jù)庫(kù)模塊。
使用XUtils只需要在libs文件夾里面加入一個(gè)jar包,如果對(duì)服務(wù)器返回的數(shù)據(jù)進(jìn)行封裝的話,還需要導(dǎo)入一個(gè)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請(qǐng)求"); btn_post.setText("發(fā)送post請(qǐng)求"); } //等同于@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; } }
通過(guò)測(cè)試,我們發(fā)現(xiàn)當(dāng)點(diǎn)擊btn_get按鈕時(shí),彈出了“發(fā)送get請(qǐng)求”的效果。到這里,大家算是對(duì)XUtils的注解有個(gè)一個(gè)基本的認(rèn)識(shí),下面我在強(qiáng)調(diào)一點(diǎn)的是,@Event這個(gè)注解默認(rèn)情況下type屬性為View.OnClickListener.class.如果你想實(shí)現(xiàn)其余點(diǎn)擊事件效果,只需要把type值進(jìn)行修改即可。
另外需要注意的一點(diǎn)是按鈕的點(diǎ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ò)圖片的方法。后面我會(huì)詳細(xì)進(jìn)行講解。
網(wǎng)絡(luò)模塊
XUtils的網(wǎng)絡(luò)請(qǐng)求方法和一些網(wǎng)絡(luò)請(qǐng)求框架的用法非常類(lèi)似,我進(jìn)行了一些簡(jiǎn)單的封裝。
封裝一共有3個(gè)文件,分別是網(wǎng)絡(luò)請(qǐng)求工具類(lèi)XUtil,請(qǐng)求響應(yīng)數(shù)據(jù)的解析類(lèi),還有一個(gè)就是一個(gè)請(qǐng)求成功的一個(gè)接口回調(diào)類(lèi)。
代碼如下:
public class XUtil { /** * 發(fā)送get請(qǐng)求 * @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請(qǐng)求 * @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è)置斷點(diǎn)續(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類(lèi)型的對(duì)象 * * @param resultType 返回值類(lèi)型(可能帶有泛型信息) * @param resultClass 返回值類(lèi)型 * @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)一的請(qǐng)求成功的邏輯處理 } @Override public void onError(Throwable ex, boolean isOnCallback) { //可以根據(jù)公司的需求進(jìn)行統(tǒng)一的請(qǐng)求網(wǎng)絡(luò)失敗的邏輯處理 } @Override public void onCancelled(CancelledException cex) { } @Override public void onFinished() { } }
1.發(fā)送get請(qǐng)求示例:
//本get請(qǐng)求來(lái)自于免費(fèi)測(cè)試接口: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請(qǐng)求
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請(qǐng)求(服務(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還是比較簡(jiǎn)單的,相信大家都可以看懂,第一個(gè)參數(shù)傳入一個(gè)View,第二個(gè)參數(shù)傳入一個(gè)圖片的網(wǎng)絡(luò)地址,第三個(gè)參數(shù)一般是加載圖片的配置。
下面看一下ImageOptions這個(gè)類(lèi)吧:
ImageOptions options=new ImageOptions.Builder() //設(shè)置加載過(guò)程中的圖片 .setLoadingDrawableId(R.drawable.ic_launcher) //設(shè)置加載失敗后的圖片 .setFailureDrawableId(R.drawable.ic_launcher) //設(shè)置使用緩存 .setUseMemCache(true) //設(shè)置顯示圓形圖片 .setCircular(true) //設(shè)置支持gif .setIgnoreGif(false) .build();
其余的一些配置請(qǐng)參考源碼
如果需要對(duì)加載的圖片進(jìn)行操作的話,可以使用:
x.image().loadDrawable(url, imageOptions, new Callback.CommonCallback<Drawable>() {...});
通過(guò)返回的Drawable對(duì)象進(jìn)行圖片的處理,滿足項(xiàng)目的個(gè)性化的要求.
說(shuō)了這么多,我想大家至少會(huì)對(duì)XUtils3有了一個(gè)基本的了解,由于XUtils3的數(shù)據(jù)庫(kù)的用法比較多,本篇文章不會(huì)去涉及,下一篇文章我會(huì)為大家詳細(xì)講解XUtils3的數(shù)據(jù)庫(kù)模塊。大家趕緊現(xiàn)在動(dòng)手操作一下吧!本文涉及到的所有實(shí)例都會(huì)在下面的demo中有涉及到,請(qǐng)自行參考。
相關(guān)閱讀:
用xutils3.0進(jìn)行下載項(xiàng)目更新
Android xUtils更新到3.0后的基本使用規(guī)則詳解
以上所述是小編給大家介紹的Android中XUtils3框架使用方法詳解(一),希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
- Android基于開(kāi)源項(xiàng)目xutils3實(shí)現(xiàn)下載
- Android使用Xutils3進(jìn)行斷點(diǎn)下載的實(shí)例
- android ListView結(jié)合x(chóng)utils3仿微信實(shí)現(xiàn)下拉加載更多
- Android Xutils3網(wǎng)絡(luò)請(qǐng)求的封裝詳解及實(shí)例代碼
- Android使用xUtils3.0實(shí)現(xiàn)文件上傳
- Android XUtils3框架的基本使用方法(二)
- Android xUtils更新到3.0后的基本使用規(guī)則詳解
- Android AS為xutils添加依賴過(guò)程圖解
相關(guān)文章
Android菜單的定義及ActionBar的實(shí)現(xiàn)
本篇文章主要介紹了Android菜單的定義及ActionBar的實(shí)現(xiàn),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-08-08Android 監(jiān)聽(tīng)apk安裝替換卸載廣播的實(shí)現(xiàn)代碼
以下代碼實(shí)現(xiàn)比較簡(jiǎn)單,根據(jù)接收到的Action來(lái)判斷應(yīng)用程序是安裝 卸載還是被替換成其他版本,需要的朋友可以參考下2013-07-07為Android的apk應(yīng)用程序文件加殼以防止反編譯的教程
這篇文章主要介紹了為Android的apk應(yīng)用程序文件加殼以防止反編譯的教程,同時(shí)對(duì)apk程序的解殼操作也有詳細(xì)講解,需要的朋友可以參考下2016-04-04Android通過(guò)AlarmManager類(lèi)實(shí)現(xiàn)簡(jiǎn)單鬧鐘功能
這篇文章主要為大家詳細(xì)介紹了Android通過(guò)AlarmManager類(lèi)實(shí)現(xiàn)簡(jiǎn)單鬧鐘功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-06-06android layout XML解析錯(cuò)誤的解決方法
從別的地方復(fù)制過(guò)來(lái)XML時(shí),layout預(yù)覽時(shí)提示解析錯(cuò)誤。2013-04-04從源碼編譯Android系統(tǒng)的Java類(lèi)庫(kù)和JNI動(dòng)態(tài)庫(kù)的方法
這篇文章主要介紹了從源碼編譯Android系統(tǒng)的Java類(lèi)庫(kù)和JNI動(dòng)態(tài)庫(kù)的方法,例子基于Linux系統(tǒng)環(huán)境下來(lái)講,需要的朋友可以參考下2016-02-02Android性能優(yōu)化之利用強(qiáng)大的LeakCanary檢測(cè)內(nèi)存泄漏及解決辦法
本篇文章主要介紹了Android性能優(yōu)化之利用LeakCanary檢測(cè)內(nèi)存泄漏及解決辦法,有興趣的同學(xué)可以了解一下。2016-11-11