Xutils3网络请求的封装

Posted Gradle官方文件

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Xutils3网络请求的封装相关的知识,希望对你有一定的参考价值。

封装了一个Xutil3的网络请求工具类,分享给大家,本人水平有限,不足之处欢迎指出。
使用前先配置xutils3:
1.gradle中添加

compile 'org.xutils:xutils:3.3.40'

2.自定义Application

/**
 * Created by Joe on 2016/9/25.
 */
public class MyApp extends Application 
    @Override
    public void onCreate() 
        super.onCreate();

        x.Ext.init(this);
        x.Ext.setDebug(BuildConfig.DEBUG); // 是否输出debug日志, 开启debug会影响性能.
    

3.清单文件application节点点添加

 android:name=".activitys.MyApp"

上面三步走完接下来就可以使用了

先写一个单利类,话不多说上代码

    private volatile static XutilsHttp instance;
    private Handler handler;
    private XutilsHttp()
        handler = new Handler(Looper.getMainLooper());
    

    /**
     * 单利模式
     * @return
     */
    public static XutilsHttp getInstance()
        if (instance == null)
            synchronized (XutilsHttp.class)
                if (instance == null)
                    instance = new XutilsHttp();
                
            
        
        return instance;
    

写好接口

    //接口回调
    public interface XCallBack
        void onResponse(String result);
        void onFail(String result);
    
    //下载的接口回调
    public interface XDownLoadCallBack
        void onstart();
        void onLoading(long total,long current,boolean isDownloading);
        void onSuccess(File result);
        void onFail(String result);
        void onFinished();
    

封装普通get请求

    /**
     * 普通get请求
     * @param url
     * @param maps
     * @param callback
     */
    public void get(String url, Map<String,String> maps, final XCallBack callback)
        RequestParams params = new RequestParams(url);
        if (null != maps && !maps.isEmpty())
            for (Map.Entry<String,String> entry : maps.entrySet())
                params.addQueryStringParameter(entry.getKey(),entry.getValue());
            
        
        x.http().get(params, new Callback.CommonCallback<String>() 
            private boolean hasError = false;
            private String result = null;
            @Override
            public void onSuccess(String result) 
                if (result != null) 
                    this.result = result;
                
            

            @Override
            public void onError(Throwable ex, boolean isOnCallback) 
                hasError = true;
                Toast.makeText(x.app(), ex.getMessage(), Toast.LENGTH_LONG).show();
            

            @Override
            public void onCancelled(CancelledException cex) 

            

            @Override
            public void onFinished() 
                if (!hasError && result != null) 
                    onSuccessResponse(result,callback);
                
            
        );
    

带缓存的get请求

    /**
     * 带缓存数据的异步get请求
     * @param url
     * @param maps
     * @param ifCache      是否缓存
     * @param cacheTime   缓存存活时间
     * @param callback
     */
    public void getCache(String url,Map<String,String> maps,final boolean ifCache,long cacheTime,final XCallBack callback)
        RequestParams params = new RequestParams(url);
        params.setCacheMaxAge(cacheTime);
        if (null != maps && maps.isEmpty())
            for (Map.Entry<String,String> entry : maps.entrySet())
                params.addQueryStringParameter(entry.getKey(),entry.getValue());
            
        
        x.http().get(params, new Callback.CacheCallback<String>() 
            private boolean hasError = false;
            private String result = null;
            @Override
            public boolean onCache(String result) 
                if (ifCache && null != result)
                    this.result = result;
                
                // true: 信任缓存数据, 不在发起网络请求; false不信任缓存数据.
                return ifCache;
            

            @Override
            public void onSuccess(String result) 
                if (result != null) 
                    this.result = result;
                
            

            @Override
            public void onError(Throwable ex, boolean isOnCallback) 
                hasError = true;
                Toast.makeText(x.app(), ex.getMessage(), Toast.LENGTH_LONG).show();
            

            @Override
            public void onCancelled(CancelledException cex) 

            

            @Override
            public void onFinished() 
                if (!hasError && result != null) 
                    onSuccessResponse(result,callback);
                
            
        );
    

普通post请求

    /**
     * 异步post请求
     * @param url
     * @param maps
     * @param callback
     */
    public void post(String url, Map<String,String> maps, final XCallBack callback)
        RequestParams params = new RequestParams(url);
        if (null != maps && !maps.isEmpty())
            for (Map.Entry<String,String> entry : maps.entrySet())
                params.addBodyParameter(entry.getKey(),entry.getValue());
            
        
        x.http().post(params, new Callback.CommonCallback<String>() 
            private boolean hasError = false;
            private String result = null;
            @Override
            public void onSuccess(String result) 
                if (result != null) 
                    this.result = result;
                
            

            @Override
            public void onError(Throwable ex, boolean isOnCallback) 
                hasError = true;
                onFailResponse(ex.getMessage(),callback);
            

            @Override
            public void onCancelled(CancelledException cex) 

            

            @Override
            public void onFinished() 
                if (!hasError && result != null) 
                    onSuccessResponse(result,callback);
                
            
        );
    

带缓存的post请求

    /**
     * 带缓存数据的异步post请求
     * @param url
     * @param maps
     * @param ifCache      是否缓存
     * @param cacheTime   缓存存活时间
     * @param callback
     */
    public void postCache(String url,Map<String,String> maps,final boolean ifCache,long cacheTime,final XCallBack callback)
        RequestParams params = new RequestParams(url);
        params.setCacheMaxAge(cacheTime);
        if (null != maps && maps.isEmpty())
            for (Map.Entry<String,String> entry : maps.entrySet())
                params.addBodyParameter(entry.getKey(),entry.getValue());
            
        
        x.http().post(params, new Callback.CacheCallback<String>() 
            private boolean hasError = false;
            private String result = null;
            @Override
            public boolean onCache(String result) 
                if (ifCache && null != result)
                    this.result = result;
                
                // true: 信任缓存数据, 不在发起网络请求; false不信任缓存数据.
                return ifCache;
            

            @Override
            public void onSuccess(String result) 
                if (result != null) 
                    this.result = result;
                
            

            @Override
            public void onError(Throwable ex, boolean isOnCallback) 
                hasError = true;
                Toast.makeText(x.app(), ex.getMessage(), Toast.LENGTH_LONG).show();
            

            @Override
            public void onCancelled(CancelledException cex) 

            

            @Override
            public void onFinished() 
                if (!hasError && result != null) 
                    onSuccessResponse(result,callback);
                
            
        );
    

文件的下载

    /**
     * 下载文件
     * @param url
     * @param filePath
     * @param callback
     */
    public void downFile(String url, String filePath, final XDownLoadCallBack callback)
        RequestParams params = new RequestParams(url);
        params.setSaveFilePath(filePath);
        params.setAutoRename(true);
        x.http().get(params, new Callback.ProgressCallback<File>() 
            @Override
            public void onSuccess(final File result) 
                //下载完成会走该方法
                handler.post(new Runnable() 
                    @Override
                    public void run() 
                        if (callback!=null)
                            callback.onSuccess(result);
                        
                    
                );
            
            @Override
            public void onError(final Throwable ex, boolean isOnCallback) 
                handler.post(new Runnable() 
                    @Override
                    public void run() 
                        if (null != callback)
                            callback.onFail(ex.getMessage());
                        
                    
                );
            
            @Override
            public void onCancelled(CancelledException cex) 
            
            @Override
            public void onFinished() 
                handler.post(new Runnable() 
                    @Override
                    public void run() 
                        if (callback!=null)
                            callback.onFinished();
                        
                    
                );
            
            //网络请求之前回调
            @Override
            public void onWaiting() 
            
            //网络请求开始的时候回调
            @Override
            public void onStarted() 
                handler.post(new Runnable() 
                    @Override
                    public void run() 
                        if (null != callback)
                            callback.onstart();
                        
                    
                );
            
            //下载的时候不断回调的方法
            @Override
            public void onLoading(final long total, final long current, final boolean isDownloading) 
                //当前进度和文件总大小
                handler.post(new Runnable() 
                    @Override
                    public void run() 
                        if (callback!=null)
                            callback.onLoading(total,current,isDownloading);
                        
                    
                );
            
        );
    

文件的上传

    /**
     * 文件上传
     *
     * @param url
     * @param maps
     * @param file
     * @param callback
     */
    public void upLoadFile(String url, Map<String, String> maps, Map<String, File> file, final XCallBack callback) 
        RequestParams params = new RequestParams(url);
        if (maps != null && !maps.isEmpty()) 
            for (Map.Entry<String, String> entry : maps.entrySet()) 
                params.addBodyParameter(entry.getKey(), entry.getValue());
            
        
        if (file != null) 
            for (Map.Entry<String, File> entry : file.entrySet()) 
                params.addBodyParameter(entry.getKey(), entry.getValue().getAbsoluteFile());
            
        
        // 有上传文件时使用multipart表单, 否则上传原始文件流.
        params.setMultipart(true);
        x.http().post(params, new Callback.CommonCallback<String>() 
            @Override
            public void onSuccess(String result) 
                onSuccessResponse(result, callback);
            

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

            

            @Override
            public void onCancelled(CancelledException cex) 

            

            @Override
            public void onFinished() 

            
        );

    

上传Json字符串到服务器

    /**
     * 上传Json串到服务器
     * @param url
     * @param maps  将需要传的各个参数放在Map集合里面
     */
    public void upLoadJson(String url, Map<String, String> maps, final XCallBack callback)
        JSONObject js_request = new JSONObject();//服务器需要传参的json对象
        try 
            for (Map.Entry<String,String> entry : maps.entrySet())
                js_request.put(entry.getKey(),entry.getValue());
            
         catch (JSONException e) 
            e.printStackTrace();
        

        RequestParams params = new RequestParams(url);
        params.setAsJsonContent(true);
        params.setBodyContent(js_request.toString());

        x.http().post(params, new Callback.CommonCallback<String>() //发起传参为json的post请求,
            // Callback.CacheCallback<String>的泛型为后台返回数据的类型,
            // 根据实际需求更改
            private boolean hasError = false;
            private String result = null;

            @Override
            public void onSuccess(String result) 
                if (result != null) 
                    this.result = result;
                
            

            @Override
            public void onError(Throwable ex, boolean isOnCallback) 
                ex.printStackTrace();
            

            @Override
            public void onCancelled(CancelledException cex) 

            

            @Override
            public void onFinished() 
                if (!hasError && result != null && callback!=null) 
                    onSuccessResponse(result,callback);
                
            
        );

    

使用案例:
下载调用:

        XutilsHttp.getInstance().downFile(url, Utils.getSDPath() + "/" + "ShopBox_Guide_Video/" + Utils.getFileName(url), new XutilsHttp.XDownLoadCallBack() 

            @Override
            public void onstart() 
                showDialog(DIALOG_DOWNLOAD_PROGRESS);
            

            @Override
            public void onLoading(long total, long current, boolean isDownloading) 
                //当前进度和文件总大小
                mProgressDialog.setMax((int) total);
                mProgressDialog.setProgress((int) current);
            

            @Override
            public void onSuccess(File result) 
                //下载完成会走该方法
                playMedia(result.getPath());
            

            @Override
            public void onFail(String result) 
                Toast.makeText(MainActivity.this, result, Toast.LENGTH_SHORT).show();
            

            @Override
            public void onFinished() 
                dismissDialog(DIALOG_DOWNLOAD_PROGRESS);
            
        );

带缓存get请求

        XutilsHttp.getInstance().postCache(url, null, true, 60000, new XutilsHttp.XCallBack() 
            @Override
            public void onResponse(String result) 
                // 成功获取数据
            

            @Override
            public void onFail(String result) 
                Toast.makeText(MainActivity.this, result, Toast.LENGTH_SHORT).show();
            
        );

就是这么简单,不足之处请大家多多指点

以上是关于Xutils3网络请求的封装的主要内容,如果未能解决你的问题,请参考以下文章

Android xUtils3源码解析之网络模块

Android xUtils3源码解析之网络模块

xutils3文件上传下载getpost请求

Android xUtils3使用 - 获取网络图片

xUtils3

xUtils3