XUtils===XUtils3框架的基本使用方法

时间:2023-03-08 22:33:56
XUtils===XUtils3框架的基本使用方法

转载自:http://blog.csdn.NET/a1002450926/article/details/50341173

今天给大家带来XUtils3的基本介绍,本文章的案例都是基于XUtils3的API语法进行的演示。相信大家对这个框架也都了解过,下面简单介绍下XUtils3的一些基本知识。

XUtils3一共有4大功能:注解模块,网络模块,图片加载模块,数据库模块。

使用XUtils只需要在libs文件夹里面加入一个jar包,如果对服务器返回的数据进行封装的话,还需要导入一个Gson的jar包。

  1. <uses-permission android:name="android.permission.INTERNET" />
  2. <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.加载当前的Activity布局需要如下注解:

@ContentView加入到Activity的上方

4.给View进行初始化需要如下注解:

@InjectView

5.处理控件的各种响应事件需要如下注解:

@Envent

  1. @ContentView(R.layout.activity_main)
  2. public class MainActivity extends ActionBarActivity {
  3. @ViewInject(R.id.btn_get)
  4. Button btn_get;
  5. @ViewInject(R.id.btn_post)
  6. Button btn_post;
  7. @Override
  8. protected void onCreate(Bundle savedInstanceState) {
  9. super.onCreate(savedInstanceState);
  10. x.view().inject(this);
  11. btn_get.setText("发送get请求");
  12. btn_post.setText("发送post请求");
  13. }
  14. //等同于@Event(value={R.id.btn_get,R.id.btn_post},type=View.OnClickListener.class)
  15. @Event(value={R.id.btn_get,R.id.btn_post})
  16. private void getEvent(View view){
  17. switch(view.getId()){
  18. case R.id.btn_get:
  19. Toast.makeText(MainActivity.this, btn_get.getText().toString().trim(), 0).show();
  20. break;
  21. case R.id.btn_post:
  22. Toast.makeText(MainActivity.this, btn_post.getText().toString().trim(), 0).show();
  23. break;
  24. }
  25. }

通过测试,我们发现当点击btn_get按钮时,弹出了“发送get请求”的效果。到这里,大家算是对XUtils的注解有个一个基本的认识,下面我在强调一点的是,@Event这个注解默认情况下type属性为View.OnClickListener.class.如果你想实现其余点击事件效果,只需要把type值进行修改即可。

另外需要注意的一点是按钮的点击事件必须用private进行修饰。

Fragment的注解:

  1. @ContentView(R.layout.fragment_first)
  2. public class FirstFragment extends Fragment{
  3. private MyAdapter adapter;
  4. private List<Person> list=new ArrayList<>();
  5. private List<String> listUrl=new ArrayList<>();
  6. private List<String> listName=new ArrayList<>();
  7. @ViewInject(R.id.btn_test)
  8. Button btn_test;
  9. @ViewInject(R.id.listView)
  10. ListView listView;
  11. @Override
  12. public View onCreateView(LayoutInflater inflater,
  13. @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
  14. return  x.view().inject(this, inflater, container);
  15. }

ViewHolder的注解:

  1. public class MyAdapter extends  BaseAdapter{
  2. private Context context;
  3. private List<Person> list;
  4. private LayoutInflater mInflater;
  5. private ImageOptions options;
  6. public ViewHolder holder;
  7. public MyAdapter(Context context, List<Person> list) {
  8. this.context = context;
  9. this.list = list;
  10. this.mInflater=LayoutInflater.from(context);
  11. options=new ImageOptions.Builder().setLoadingDrawableId(R.drawable.ic_launcher)
  12. .setLoadingDrawableId(R.drawable.ic_launcher).setUseMemCache(true).setCircular(true).build();
  13. }
  14. @Override
  15. public int getCount() {
  16. return list.size();
  17. }
  18. @Override
  19. public Object getItem(int position) {
  20. return list.get(position);
  21. }
  22. @Override
  23. public long getItemId(int position) {
  24. return position;
  25. }
  26. @Override
  27. public View getView(int position, View convertView, ViewGroup parent) {
  28. holder=null;
  29. if(convertView==null){
  30. convertView=mInflater.inflate(R.layout.itemone, null);
  31. holder=new ViewHolder();
  32. x.view().inject(holder,convertView);
  33. convertView.setTag(holder);
  34. }
  35. else{
  36. holder=(ViewHolder) convertView.getTag();
  37. }
  38. Person bean=list.get(position);
  39. holder.tv_name.setText(bean.getName());
  40. x.image().bind(holder.iv_image, bean.getImgUrl(), options);
  41. return convertView;
  42. }
  43. class ViewHolder{
  44. @ViewInject(R.id.tv_name)
  45. private TextView tv_name;
  46. @ViewInject(R.id.iv_image)
  47. private ImageView iv_image;
  48. }

上面的代码是注解ViewHolder的标准模式,相信大家完全能够看明白。这里我加载图片使用到了XUtils3的加载网络图片的方法。后面我会详细进行讲解。

网络模块

XUtils的网络请求方法和一些网络请求框架的用法非常类似,我进行了一些简单的封装。

封装一共有3个文件,分别是网络请求工具类XUtil,请求响应数据的解析类,还有一个就是一个请求成功的一个接口回调类。

代码如下:

  1. public class XUtil {
  2. /**
  3. * 发送get请求
  4. * @param <T>
  5. */
  6. public static <T> Cancelable Get(String url,Map<String,String> map,CommonCallback<T> callback){
  7. RequestParams params=new RequestParams(url);
  8. if(null!=map){
  9. for(Map.Entry<String, String> entry : map.entrySet()){
  10. params.addQueryStringParameter(entry.getKey(), entry.getValue());
  11. }
  12. }
  13. Cancelable cancelable = x.http().get(params, callback);
  14. return cancelable;
  15. }
  16. /**
  17. * 发送post请求
  18. * @param <T>
  19. */
  20. public static <T> Cancelable Post(String url,Map<String,Object> map,CommonCallback<T> callback){
  21. RequestParams params=new RequestParams(url);
  22. if(null!=map){
  23. for(Map.Entry<String, Object> entry : map.entrySet()){
  24. params.addParameter(entry.getKey(), entry.getValue());
  25. }
  26. }
  27. Cancelable cancelable = x.http().post(params, callback);
  28. return cancelable;
  29. }
  30. /**
  31. * 上传文件
  32. * @param <T>
  33. */
  34. public static <T> Cancelable UpLoadFile(String url,Map<String,Object> map,CommonCallback<T> callback){
  35. RequestParams params=new RequestParams(url);
  36. if(null!=map){
  37. for(Map.Entry<String, Object> entry : map.entrySet()){
  38. params.addParameter(entry.getKey(), entry.getValue());
  39. }
  40. }
  41. params.setMultipart(true);
  42. Cancelable cancelable = x.http().get(params, callback);
  43. return cancelable;
  44. }
  45. /**
  46. * 下载文件
  47. * @param <T>
  48. */
  49. public static <T> Cancelable DownLoadFile(String url,String filepath,CommonCallback<T> callback){
  50. RequestParams params=new RequestParams(url);
  51. //设置断点续传
  52. params.setAutoResume(true);
  53. params.setSaveFilePath(filepath);
  54. Cancelable cancelable = x.http().get(params, callback);
  55. return cancelable;
  56. }
  57. }
  58. public class JsonResponseParser implements ResponseParser {
  59. //检查服务器返回的响应头信息
  60. @Override
  61. public void checkResponse(UriRequest request) throws Throwable {
  62. }
  63. /**
  64. * 转换result为resultType类型的对象
  65. *
  66. * @param resultType  返回值类型(可能带有泛型信息)
  67. * @param resultClass 返回值类型
  68. * @param result      字符串数据
  69. * @return
  70. * @throws Throwable
  71. */
  72. @Override
  73. public Object parse(Type resultType, Class<?> resultClass, String result) throws Throwable {
  74. return new Gson().fromJson(result, resultClass);
  75. }
  76. }
  77. public class MyCallBack<ResultType> implements Callback.CommonCallback<ResultType>{
  78. @Override
  79. public void onSuccess(ResultType result) {
  80. //可以根据公司的需求进行统一的请求成功的逻辑处理
  81. }
  82. @Override
  83. public void onError(Throwable ex, boolean isOnCallback) {
  84. //可以根据公司的需求进行统一的请求网络失败的逻辑处理
  85. }
  86. @Override
  87. public void onCancelled(CancelledException cex) {
  88. }
  89. @Override
  90. public void onFinished() {
  91. }
  92. }

1.发送get请求示例:

  1. //本get请求来自于免费测试接口:http://www.k780.com/api/entry.baidu
  2. String url="http://api.k780.com:88/?app=idcard.get";
  3. Map<String,String> map=new HashMap<>();
  4. map.put("appkey", "10003");
  5. map.put("sign", "b59bc3ef6191eb9f747dd4e83c99f2a4");
  6. map.put("format", "json");
  7. map.put("idcard", "110101199001011114");
  8. XUtil.Get(url, map, new MyCallBack<PersonInfoBean>(){
  9. @Override
  10. public void onSuccess(PersonInfoBean result) {
  11. super.onSuccess(result);
  12. Log.e("result", result.toString());
  13. }
  14. @Override
  15. public void onError(Throwable ex, boolean isOnCallback) {
  16. super.onError(ex, isOnCallback);
  17. }
  18. });

2.发送post请求

  1. String url="http://api.k780.com:88/?app=idcard.get";
  2. Map<String,Object> map=new HashMap<>();
  3. map.put("appkey", "10003");
  4. map.put("sign", "b59bc3ef6191eb9f747dd4e83c99f2a4");
  5. map.put("format", "json");
  6. map.put("idcard", "110101199001011114");
  7. XUtil.Post(url, map, new MyCallBack<PersonInfoBean>(){
  8. @Override
  9. public void onSuccess(PersonInfoBean result) {
  10. super.onSuccess(result);
  11. Log.e("result", result.toString());
  12. }
  13. @Override
  14. public void onError(Throwable ex, boolean isOnCallback) {
  15. super.onError(ex, isOnCallback);
  16. }
  17. });

3.上传文件

  1. /**
  2. * 上传文件(支持多文件上传)
  3. */
  4. private void uploadfile() {
  5. //图片上传地址
  6. String url="";
  7. Map<String,Object> map=new HashMap<>();
  8. //传入自己的相应参数
  9. //map.put(key, value);
  10. //map.put(key, value);
  11. XUtil.UpLoadFile(url, map, new MyCallBack<String>(){
  12. @Override
  13. public void onSuccess(String result) {
  14. super.onSuccess(result);
  15. }
  16. @Override
  17. public void onError(Throwable ex, boolean isOnCallback) {
  18. super.onError(ex, isOnCallback);
  19. }
  20. });
  21. }

4.下载文件

  1. private void downloadfile() {
  2. //文件下载地址
  3. String url="";
  4. //文件保存在本地的路径
  5. String filepath="";
  6. XUtil.DownLoadFile(url, filepath,new MyCallBack<File>(){
  7. @Override
  8. public void onSuccess(File result) {
  9. super.onSuccess(result);
  10. }
  11. @Override
  12. public void onError(Throwable ex, boolean isOnCallback) {
  13. super.onError(ex, isOnCallback);
  14. }
  15. });

5.下载文件带进度条

  1. private void downloadprogressfile() {
  2. //文件下载地址
  3. String url="";
  4. //文件保存在本地的路径
  5. String filepath="";
  6. XUtil.DownLoadFile(url, filepath,new MyProgressCallBack<File>(){
  7. @Override
  8. public void onSuccess(File result) {
  9. super.onSuccess(result);
  10. }
  11. @Override
  12. public void onError(Throwable ex, boolean isOnCallback) {
  13. super.onError(ex, isOnCallback);
  14. }
  15. @Override
  16. public void onLoading(long total, long current,
  17. boolean isDownloading) {
  18. super.onLoading(total, current, isDownloading);
  19. }
  20. });
  21. }

6.发送get请求(服务器以xml格式返回)

  1. private void getxml() {
  2. String url="http://flash.weather.com.cn/wmaps/xml/china.xml";
  3. XUtil.Get(url, null, new MyCallBack<String>(){
  4. @Override
  5. public void onSuccess(String xmlString) {
  6. super.onSuccess(xmlString);
  7. try{
  8. XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
  9. XmlPullParser xmlPullParser = factory.newPullParser();
  10. xmlPullParser.setInput(new StringReader(xmlString));
  11. int eventType = xmlPullParser.getEventType();
  12. while (eventType != XmlPullParser.END_DOCUMENT) {
  13. switch (eventType) {
  14. case XmlPullParser.START_TAG:
  15. String nodeName = xmlPullParser.getName();
  16. if ("city".equals(nodeName)) {
  17. String pName = xmlPullParser.getAttributeValue(0);
  18. Log.e("TAG", "city is " + pName);
  19. }
  20. break;
  21. }
  22. eventType = xmlPullParser.next();
  23. }
  24. }catch(Exception e){
  25. e.printStackTrace();
  26. }
  27. }
  28. @Override
  29. public void onError(Throwable ex, boolean isOnCallback) {
  30. super.onError(ex, isOnCallback);
  31. }
  32. });
  33. }

图片加载模块

用法:

  1. x.image().bind(imageView, url, imageOptions);
  2. x.image().bind(imageView, "file:///sdcard/test.gif", imageOptions);
  3. x.image().bind(imageView, "assets://test.gif", imageOptions);
  4. x.image().bind(imageView, url, imageOptions, new Callback.CommonCallback<Drawable>() {...});
  5. x.image().loadDrawable(url, imageOptions, new Callback.CommonCallback<Drawable>() {...});
  6. x.image().loadFile(url, imageOptions, new Callback.CommonCallback<File>() {...});

Xutils3的api还是比较简单的,相信大家都可以看懂,第一个参数传入一个View,第二个参数传入一个图片的网络地址,第三个参数一般是加载图片的配置。

下面看一下ImageOptions这个类吧:

  1. ImageOptions options=new ImageOptions.Builder()
  2. //设置加载过程中的图片
  3. .setLoadingDrawableId(R.drawable.ic_launcher)
  4. //设置加载失败后的图片
  5. .setFailureDrawableId(R.drawable.ic_launcher)
  6. //设置使用缓存
  7. .setUseMemCache(true)
  8. //设置显示圆形图片
  9. .setCircular(true)
  10. //设置支持gif
  11. .setIgnoreGif(false)
  12. .build();

其余的一些配置请参考源码

如果需要对加载的图片进行操作的话,可以使用:

x.image().loadDrawable(url, imageOptions, new Callback.CommonCallback<Drawable>() {...});

通过返回的Drawable对象进行图片的处理,满足项目的个性化的要求.

说了这么多,我想大家至少会对XUtils3有了一个基本的了解,由于XUtils3的数据库的用法比较多,本篇文章不会去涉及,下一篇文章我会为大家详细讲解XUtils3的数据库模块。大家赶紧现在动手操作一下吧!本文涉及到的所有实例都会在下面的demo中有涉及到,请自行参考。

源码下载地址:http://download.csdn.net/detail/a1002450926/9364413