xUtils3

今天给大家带来XUtils3的基本介绍,本文章的案例都是基于XUtils3的API语法进行的演示。相信大家对这个框架也都了解过,下面简单介绍下XUtils3的一些基本知识。
XUtils3一共有4大功能:注解模块,网络模块,图片加载模块,数据库模块。
使用XUtils只需要在libs文件夹里面加入一个jar包,如果对服务器返回的数据进行封装的话,还需要导入一个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.加载当前的Activity布局需要如下注解: 
@ContentView加入到Activity的上方 
4.给View进行初始化需要如下注解: 
@InjectView 
5.处理控件的各种响应事件需要如下注解: 
@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("发送get请求");
        btn_post.setText("发送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;
        }
    }
通过测试,我们发现当点击btn_get按钮时,弹出了“发送get请求”的效果。到这里,大家算是对XUtils的注解有个一个基本的认识,下面我在强调一点的是,@Event这个注解默认情况下type属性为View.OnClickListener.class.如果你想实现其余点击事件效果,只需要把type值进行修改即可。 
另外需要注意的一点是按钮的点击事件必须用private进行修饰。
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的标准模式,相信大家完全能够看明白。这里我加载图片使用到了XUtils3的加载网络图片的方法。后面我会详细进行讲解。
网络模块
XUtils的网络请求方法和一些网络请求框架的用法非常类似,我进行了一些简单的封装。 
封装一共有3个文件,分别是网络请求工具类XUtil,请求响应数据的解析类,还有一个就是一个请求成功的一个接口回调类。 
代码如下:
public class XUtil {
    /**
     * 发送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;
    }    
    /**
     * 发送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);        //设置断点续传
        params.setAutoResume(true);
        params.setSaveFilePath(filepath);
        Cancelable cancelable = x.http().get(params, callback);        
        return cancelable;
    }
}
public class JsonResponseParser implements ResponseParser {
    //检查服务器返回的响应头信息
    @Override
    public void checkResponse(UriRequest request) throws Throwable {
    }    
    /**
     * 转换result为resultType类型的对象
     *
     * @param resultType  返回值类型(可能带有泛型信息)
     * @param resultClass 返回值类型
     * @param result      字符串数据
     * @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) {        //可以根据公司的需求进行统一的请求成功的逻辑处理
    }

    @Override    
    public void onError(Throwable ex, boolean isOnCallback) {        //可以根据公司的需求进行统一的请求网络失败的逻辑处理
    }

    @Override    
    public void onCancelled(CancelledException cex) {

    }

    @Override    public void onFinished() {

    }


}
1.发送get请求示例:
//本get请求来自于免费测试接口:http://www.k780.com/api/entry.baiduString 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.发送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<>();        //传入自己的相应参数
        //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.下载文件带进度条
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.发送get请求(服务器以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还是比较简单的,相信大家都可以看懂,第一个参数传入一个View,第二个参数传入一个图片的网络地址,第三个参数一般是加载图片的配置。 
下面看一下ImageOptions这个类吧:
ImageOptions options=new ImageOptions.Builder()
//设置加载过程中的图片.setLoadingDrawableId(R.drawable.ic_launcher)
//设置加载失败后的图片.setFailureDrawableId(R.drawable.ic_launcher)
//设置使用缓存.setUseMemCache(true)
//设置显示圆形图片.setCircular(true)
//设置支持gif.setIgnoreGif(false).build();
其余的一些配置请参考源码
如果需要对加载的图片进行操作的话,可以使用:
x.image().loadDrawable(url, imageOptions, new Callback.CommonCallback<Drawable>() {...});
通过返回的Drawable对象进行图片的处理,满足项目的个性化的要求.
xUtils 包含了很多实用的android工具. xUtils 支持超大文件(超过2G)上传,更全面的http请求协议支持(11种谓词),拥有更加灵活的ORM,更多的事件注解支持且不受混淆影响... xUtils 最低兼容Android 4.0 (api level 14). (Android 2.3?) xUtils3变化较多所以建立了新的项目不在旧版(github.com/wyouflf/xUtils)上继续维护, 相对于旧版本: HTTP实现替换HttpClient为UrlConnection, 自动解析回调泛型, 更安全的断点续传策略. 支持标准的Cookie策略, 区分domain, path. 事件注解去除不常用的功能, 提高性能. 数据库api简化提高性能, 达到和greenDao一致的性能. 图片绑定支持gif, webp; 支持圆角, 圆形, 方形等裁剪, 支持自动旋转... 使用Gradle构建时添加一下依赖即可: compile 'org.xutils:xutils:3.1.+' // or // compile 'org.xutils:xutils:3.1.15' 如果使用eclipse可以 点击这里下载aar文件, 然后用zip解压, 取出jar包和so文件. 混淆配置参考示例项目sample的配置 使用前配置 需要的权限 初始化 // 在application的onCreate中初始化 @Override public void onCreate() { super.onCreate(); x.Ext.init(this); x.Ext.setDebug(true); // 是否输出debug日志 ... } 使用@Event事件注解(@ContentView, @ViewInject等更多示例参考sample项目) /** * 1. 方法必须私有限定, * 2. 方法以Click或Event结尾, 方便配置混淆编译参数 : * -keepattributes *Annotation* * -keepclassmembers class * { * void *(android.view.View); * *** *Click(...); * *** *Event(...); * } * 3. 方法参数形式必须和type对应的Listener接口一致. * 4. 注解参数value支持数组: value={id1, id2, id3} * 5. 其它参数说明见{@link org.xutils.event.annotation.Event}类的说明. **/ @Event(value = R.id.btn_test_baidu1, type = View.OnClickListener.class/*可选参数, 默认是View.OnClickListener.class*/) private void onTestBaidu1Click(View view) { ... } 访问网络(更多示例参考sample项目) /** * 自定义实体参数类请参考: * 请求注解 {@link org.xutils.http.annotation.HttpRequest} * 请求注解处理模板接口 {@link org.xutils.http.app.ParamsBuilder} * * 需要自定义类型作为callback的泛型时, 参考: * 响应注解 {@link org.xutils.http.annotation.HttpResponse} * 响应注解处理模板接口 {@link org.xutils.http.app.ResponseParser} * * 示例: 查看 org.xutils.sample.http 包里的代码 */ BaiduParams params = new BaiduParams(); params.wd = "xUtils"; // 有上传文件时使用multipart表单, 否则上传原始文件流. // params.setMultipart(true); // 上传文件方式 1 // params.uploadFile = new File("/sdcard/test.txt"); // 上传
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值