一:介绍

xutils是一个热门的安卓开发框架,封装了网络请求工具,注解工具,数据库工具,日志打印工具.Android6.0之后sdk放弃了httpclient,所以xutils2.6中因为底层用的httpclient所以在xutils3之后把网络请求全部换成了httpurlconnection,从而与Android6.0更好的兼容,下面就介绍xutils3之后版本使用方法

二:引入xutils3并初始化

1.引入xutils3:用Androidstudio新建工程之后,引入xutils3,方法如下,点击ok之后等待一会就可以了! eclipse可以在github上下载源码,然后导入依赖即可

android 第三方日志平台_xutils注解


2.初始化xutils3

新建一个application,在oncreat方法中初始化

@Override
    public void onCreate() {
        super.onCreate();
        myApp = this;
        x.Ext.init(this);//初始化sdk
        x.Ext.setDebug(true);//处于开发阶段,设置打印日志
    }



3.别忘了在清单文件中引入application

android:name=".MyApp"


三:使用最多的就是网络工具类,先看一下网络请求

1.get请求示例,与xutils2.6版本的httputils不一样了,而且必须要重写的回调方法增多了,可以想象如果一个activity中发起了多次这样的网络请求,那样会产生很多的重复代码,所以后面会对回调封装一下,把回调方法全部封装到一个类当中,后面可以下载demo,demo比较全而且详细!

private void get() {
        String path = "http://mobileapi.72g.com/index.php?tp=andv4/index_new&op=jifen&point=100";
        RequestParams params = new RequestParams(path);
        //x.http().get(params, new CommonStringCallback(handler, 1));
        x.http().get(params, new Callback.CommonCallback<String>() {
            @Override
            public void onSuccess(String result) {
                LogUtil.e(result);
            }

            @Override
            public void onError(Throwable ex, boolean isOnCallback) {
                LogUtil.e("onError" + ex.getMessage());
            }

            @Override
            public void onCancelled(CancelledException cex) {
                LogUtil.e("onCancelled");
            }
            //这个回调不管是否请求成功最后都一定会执行
            @Override
            public void onFinished() {
                LogUtil.e("onFinished");
            }
        });
    }



2.post请求,就是加了参数

private void post() {
        //百科	post: rows=15&page=0&type=16
        String BAIKEPATH = "http://sns.maimaicha.com/api?apikey=b4f4ee31a8b9acc866ef2afb754c33e6&format=json&method=news.getListByType";
        RequestParams params = new RequestParams(BAIKEPATH);
        //默认是启用缓存,这里设置没有缓存
        params.setUseCookie(false);
        params.addBodyParameter("rows", "15");
        params.addBodyParameter("page", "0");
        params.addBodyParameter("type", "16");
        x.http().post(params, new Callback.CommonCallback<String>() {
            @Override
            public void onSuccess(String result) {
                LogUtil.e(result);
            }

            @Override
            public void onError(Throwable ex, boolean isOnCallback) {

            }

            @Override
            public void onCancelled(CancelledException cex) {

            }

            @Override
            public void onFinished() {

            }
        });
    }



3.网络图片请求

(1).不需要其他操作的:

x.image().bind(img_show, "http://d.hiphotos.baidu.com/image/pic/item/562c11dfa9ec8a13f075f10cf303918fa1ecc0eb.jpg");



(2).需要对图片做其他操作的,加回调函数

x.image().bind(img_show, "http://d.hiphotos.baidu.com/image/pic/item/562c11dfa9ec8a13f075f10cf303918fa1ecc0eb.jpg", new Callback.CommonCallback<Drawable>() {
            @Override
            public void onSuccess(Drawable result) {
                //可以在这里对下载的图片进行额外操作,比如写进文件

            }

            @Override
            public void onError(Throwable ex, boolean isOnCallback) {

            }

            @Override
            public void onCancelled(CancelledException cex) {

            }

            @Override
            public void onFinished() {

            }
        });



(3).给图片设置圆角,动画,这样就可以

ImageOptions.Builder builder = new ImageOptions.Builder();
        builder.setAnimation(AnimationUtils.loadAnimation(MainActivity.this, R.anim.a));//添加动画效果
        builder.setRadius(30);//设置圆角
        manager.bind(img_show, "http://d.hiphotos.baidu.com/image/pic/item/562c11dfa9ec8a13f075f10cf303918fa1ecc0eb.jpg", builder.build());



(4).这里特别说明一下,如果请求的图片较多,可以这样写

ImageManager manager = x.image();//可以重复使用,不需要再次创建
        manager.bind(img_show,"http://d.hiphotos.baidu.com/image/pic/item/562c11dfa9ec8a13f075f10cf303918fa1ecc0eb.jpg");



4.下载文件,同样是网络请求

private void downloadFile() {
        //进度对话框
        dialog = new ProgressDialog(context);
        dialog.setTitle("下载进度");
        dialog.setMessage("拼命下载中");
        dialog.setMax(100);
        dialog.setButton(DialogInterface.BUTTON_NEGATIVE, "取消", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                dialog.dismiss();
            }
        });
        //开始下载
        String pathUrl = "http://down.72g.com/upload/app/201407/201407150923238621.apk";
        RequestParams params = new RequestParams(pathUrl);
        dialog.show();
        x.http().get(params, new Callback.CommonCallback<File>() {

            @Override
            public void onSuccess(File result) {
                dialog.dismiss();
                File file = result;
                if (file.exists()) {
                    //设置安装路径
                    AutoInstall.setUrl(file.getAbsolutePath());
                    //调用系统安装界面进行安装
                    AutoInstall.install(context);
                } else {
                    Toast.makeText(context, "该安装包不存在", Toast.LENGTH_SHORT).show();
                }
            }

            @Override
            public void onError(Throwable ex, boolean isOnCallback) {
                LogUtil.e("onError");
            }

            @Override
            public void onCancelled(CancelledException cex) {
                dialog.dismiss();
            }

            @Override
            public void onFinished() {
                LogUtil.e("onFinished");
            }
        });
    }



四:xutils3还有一个工具类就是注解工具类,看一下用法,只需要看里面注解的部分即可,也是很方便的

public class MainActivity extends AppCompatActivity {
    private Context context = this;
    //注解
    @ViewInject(R.id.img_show)
    private ImageView img_show;
    @ViewInject(R.id.txt)
    private TextView txt;

    //多个按钮点击事件注解
    @Event(value = {R.id.btn1, R.id.btn2})
    private void onClick(View view) {
        switch (view.getId()) {
            case R.id.btn1:
                Toast.makeText(context, "点击了", Toast.LENGTH_SHORT).show();
                break;
            case R.id.btn2:
                Toast.makeText(context, "点击了第二个", Toast.LENGTH_SHORT).show();
                break;
        }
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        x.view().inject(this);
        txt.setText("我是注解TextView");
    }
}


五.日志打印工具不用多说了,在上面get请求的回调方法中也用到了,很简单,拿来就用

LogUtil.e("onError");



六.重头戏来了,对网络请求的封装

封装原理:因为每次网络请求都会有4个必须写的回调函数,这样如果有多个网络请求,那么就会产生很多的重复代码,这里对网络请求的回调进行封装,用handler传回请求的结果(一般是list集合),用what值区分不同的网络请求,看代码.对于传回网络请求的结果,大家也可以用EventBus框架,EventBus耦合度极低.

这是网络请求回调的封装类

package com.zidiv.xutils3demo;

import android.os.Handler;
import android.os.Message;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;

import org.xutils.common.Callback;
import org.xutils.common.util.LogUtil;

import java.util.List;

/**
 * Created by Administrator on 2016/2/18.
 */
public class CommonStringCallback implements Callback.CommonCallback<String> {

    private Handler handler;
    private int what;

    public CommonStringCallback(Handler handler, int what) {
        this.handler = handler;
        this.what = what;
    }


    @Override
    public void onSuccess(String result) {
        //json解析
        JSONObject object = JSON.parseObject(result);
        JSONArray array = object.getJSONArray("info");
        List<Bean> list = JSON.parseArray(array.toJSONString(), Bean.class);
        Message message = Message.obtain();
        message.what = what;
        message.obj = list;
        handler.sendMessage(message);
    }

    @Override
    public void onError(Throwable ex, boolean isOnCallback) {
        LogUtil.e("请求失败:" + ex);
    }

    @Override
    public void onCancelled(CancelledException cex) {

    }

    @Override
    public void onFinished() {

    }
}



有了这个封装类之后,我们发起网络请求就可以这样写,很简洁

String path = "http://mobileapi.72g.com/index.php?tp=andv4/index_new&op=jifen&point=100";
        RequestParams params = new RequestParams(path);
        x.http().get(params, new CommonStringCallback(handler, 1));



网络请求的结果在handler中拿到

private Handler handler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            switch (msg.what) {
                case 1:
                    List<Bean> list = (List<Bean>) msg.obj;
                    Toast.makeText(context, list.get(0).getName(), Toast.LENGTH_LONG).show();
                    break;
            }
        }
    };



七.好了,xutils3新版本使用方法就介绍到这里,这里附上demo,点击下载demo,demo里比较全.谢谢大家!