xUtils3是安卓网络访问的重要库,基本上的网络请求所涉及的内容都有集成。笔者将实现xUtils3的简单使用,包括简单GET和POST请求、文件上传、文件下载、图片显示。

其主要特性有以下几点:

①提供异步网络请求

②支持超大文件(超过2G)上传

③有了强大的HTTP及其下载缓存的支持,支持文件断点续传

④全面的HTTP请求协议支持(GET,POST等)

⑤图片绑定支持gif(受系统兼容性影响,部分gif文件只能静态显示),支持圆角、圆形、方形显示图片,支持图片裁剪,支持自动旋转

初始化工作:

添加依赖

 compile 'org.xutils:xutils:3.4.0'

新建初始化类

新建一个类:Xutilsinit,将新建的类放在MainActivity同级目录下(同一个包下)即可

 import org.xutils.x;
class Xutilsinit extends Application {
@Override
public void onCreate() {
super.onCreate();
x.Ext.init(this);
x.Ext.setDebug(true);//是否输出Debug日志
}
}

必要权限获取及类声明

在AndroidManifest.xml,第一个权限为网络访问权限,第二个为文件读写权限,文件读写权限在某些手机上是需要另外手动获取,否则将影响文件的上传和下载功能。

 <uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

简单的GET和POST请求实现:

不用自己另起线程,直接在主线程写就好了,框架实现了线程访问。

 /设置需要访问的URL
String url="http://193.112.87.88/library/user_login.php"; //设置post表单数据,以键值对设置
RequestParams params =new RequestParams(url);
params.addBodyParameter("account","164");
params.addBodyParameter("password","dong"); //简单的加载提示框
final ProgressDialog dia=new ProgressDialog(MainActivity.this);
dia.setMessage("东小东加载中……");
dia.show(); //开始网络访问
//如果是get请求,则x.http().get(params, new Callback.CommonCallback<String>() 即可
x.http().post(params, new Callback.CommonCallback<String>() {
@Override
public void onSuccess(String result) {
//访问成功时进入,得到访问返回的数据
Toast.makeText(x.app(),"东小东提示获取的数据为:"+ result, Toast.LENGTH_LONG).show();
System.out.println("获取到的数据是"+result); } @Override
public void onError(Throwable ex, boolean isOnCallback) {
//请求错误进入
Toast.makeText(x.app(),"东小东提示:请求错误", Toast.LENGTH_LONG).show(); } @Override
public void onCancelled(Callback.CancelledException cex) {
////主动调用取消请求的回调方法
} @Override
public void onFinished() {
//访问结束时进入,停止加载框
dia.dismiss();
}
});

POST文件上传:

利用POST提交表单的形式进行文件上传,其中params.setMultipart(true);是表示使用二进制的方式上传数据,需要进行文件上传时必须加入这句。

 //设置需要访问的URL
String url="http://193.112.87.55/file1.php"; //设置post表单数据,以键值对设置
RequestParams params =new RequestParams(url);
params.setMultipart(true);
params.addBodyParameter("yzm","112233"); //File filex= new File(Environment.getExternalStorageDirectory()+"/东小东.jpg");
// params.addBodyParameter("img", filex, "multipart/form-data","dongxiaodong.jpg");//其中dongxiaodong.jpg为重命名 //生成文件对象,需要绝对路径
File filex= new File(Environment.getExternalStorageDirectory()+"/gg.mp3");
params.addBodyParameter("img", filex, "multipart/form-data");//保留文件原名 //简单的加载提示框
final ProgressDialog dia=new ProgressDialog(MainActivity.this);
dia.setMessage("东小东加载中……");
dia.show(); //开始网络访问
x.http().post(params, new Callback.CommonCallback<String>() {
@Override
public void onSuccess(String result) {
//访问成功时进入,得到访问返回的数据
Toast.makeText(x.app(),"东小东提示获取的数据为:"+ result, Toast.LENGTH_LONG).show();
System.out.println("获取到的数据是"+result); } @Override
public void onError(Throwable ex, boolean isOnCallback) {
//请求错误进入
Toast.makeText(x.app(),"东小东提示:请求错误", Toast.LENGTH_LONG).show(); } @Override
public void onCancelled(Callback.CancelledException cex) {
////主动调用取消请求的回调方法
Toast.makeText(x.app(),"东小东提示:已取消请求", Toast.LENGTH_LONG).show();
} @Override
public void onFinished() {
//访问结束时进入,停止加载框
Toast.makeText(x.app(),"东小东提示:完成请求", Toast.LENGTH_LONG).show();
dia.dismiss();
}
});

文件下载实现:

文件下载时使用异步任务进行的,其还实现了断点续传功能,观看下载文件夹可了解到下载时会自动生成一个缓存文件存放下载内容。基本判断应该是下次下载时会将下载文件与缓存文件进行对比,而实现断点续传功能。

 private void downloadUpdateApk() {
if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) { //简单的加载提示框
final ProgressDialog dia=new ProgressDialog(MainActivity.this);
dia.setMessage("东小东马上下载中........");
dia.show(); //下载地址
RequestParams requestParams = new RequestParams("http://193.112.87.88/filexxx/gg.mp3");
// 文件下载后的保存路径及文件名
requestParams.setSaveFilePath(Environment.getExternalStorageDirectory()+"/dongxiaodong/东小东.mp3");
// 下载完成后自动为文件命名
requestParams.setAutoRename(false);
//下载请求
x.http().get(requestParams, new Callback.ProgressCallback<File>() { @Override
public void onSuccess(File result) {
//倒数第二调用
Toast.makeText(MainActivity.this,"下载完成",Toast.LENGTH_SHORT).show();
System.out.println("---------------下载完成---------------------------");
dia.setMessage("东小东下载完成**");
} @Override
public void onError(Throwable ex, boolean isOnCallback) {
Toast.makeText(MainActivity.this,"下载失败",Toast.LENGTH_SHORT).show();
System.out.println("---------------下载失败---------------------------"); } @Override
public void onCancelled(CancelledException cex) { Toast.makeText(MainActivity.this,"取消下载",Toast.LENGTH_SHORT).show();
System.out.println("---------------取消下载---------------------------");
} @Override
public void onFinished() {
//最后调用
Toast.makeText(MainActivity.this,"下载结束",Toast.LENGTH_SHORT).show();
System.out.println("---------------下载结束---------------------------");
dia.dismiss(); } @Override
public void onWaiting() {
// 最开始调用
Toast.makeText(MainActivity.this,"等待下载",Toast.LENGTH_SHORT).show();
System.out.println("---------------等待下载---------------------------"); } @Override
public void onStarted() {
//第二调用
Toast.makeText(MainActivity.this,"开始下载",Toast.LENGTH_SHORT).show();
System.out.println("---------------开始下载---------------------------");
dia.setMessage("东小东下载开始----");
} @Override
public void onLoading(long total, long current, boolean isDownloading) {
// 当前的下载进度和文件总大小
// 下载的时候不断回调的方法
//参数:总大小,已经下载的大小,是否正在下载
System.out.println("***"+total+"********"+current+"****************"+isDownloading+"**********");
//百分比为整数
System.out.println("下载进度为:"+(int)(((float)current/total)*100)+"%");
//百分比为小数
dia.setMessage("东小东下载进度为:"+((float)current/total)*100+"%"); }
});
} }

图片显示:

ImageOptions是强大的网络图片加载显示的工具类,可以实现图片的缓存、图片的直角、圆角、圆形显示及图片的裁剪,另外还支持gif动态显示。

显示效果

图片显示封装类

 import android.widget.ImageView;
import org.xutils.common.util.DensityUtil;
import org.xutils.image.ImageOptions;
import org.xutils.x; /**
* Created by 东东 on 2018/12/29.
*/
public class ShowImage { //显示默认图片,参数(图片控件,图片地址),地址可为网络或本地地址
public static void displaydDfault(ImageView imageView, String iconUrl) {
ImageOptions imageOptions = new ImageOptions.Builder()
.setIgnoreGif(false)//是否忽略gif图。false表示不忽略。不写这句,默认是true
.setImageScaleType(ImageView.ScaleType.CENTER_CROP)
.setIgnoreGif(false)//是否忽略gif图,false表示不忽略,不写这句,默认是true
.setUseMemCache(true)//是否支持缓存
.setFailureDrawableId(R.mipmap.ic_launcher)//设置加载失败显示的图片
.setLoadingDrawableId(R.mipmap.ic_launcher)//设置加载中显示的图片
.build();
x.image().bind(imageView, iconUrl,imageOptions);
} //显示圆角图片,参数(图片控件,圆角半径,图片地址),地址可为网络或本地地址
//圆角半径,100为圆形
public static void displayCutR(ImageView imageView, int radius, String iconUrl) {
ImageOptions imageOptions = new ImageOptions.Builder()
// .setSize(DensityUtil.dip2px(120), DensityUtil.dip2px(120))//图片大小
.setImageScaleType(ImageView.ScaleType.CENTER_CROP)
.setRadius(DensityUtil.dip2px(radius))
.setIgnoreGif(false)//是否忽略gif图,false表示不忽略,不写这句,默认是true
.setCrop(true)//是否对图片进行裁剪
.setFailureDrawableId(R.mipmap.ic_launcher)
.setLoadingDrawableId(R.mipmap.ic_launcher)
.build();
x.image().bind(imageView, iconUrl, imageOptions);
} //显示圆形图片,参数(图片控件,图片地址),地址可为网络或本地地址
public static void displayRoundness(ImageView imageView, String iconUrl) {
ImageOptions imageOptions = new ImageOptions.Builder()
.setImageScaleType(ImageView.ScaleType.CENTER_CROP)
.setCircular(true)//显示圆形,半径根据控件控制
.setCrop(true)
.setIgnoreGif(false)//是否忽略gif图,false表示不忽略,不写这句,默认是true
.setLoadingDrawableId(R.mipmap.ic_launcher)
.setFailureDrawableId(R.mipmap.ic_launcher)
.build();
x.image().bind(imageView, iconUrl, imageOptions);
}
}

在需要显示中使用

 //图片地址
String urlx="https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1546085784363&di=8ab50ca92e77dcc09ef658b636872f51&imgtype=0&src=http%3A%2F%2Fi0.bbs.fd.zol-img.com.cn%2Ft_s800x5000%2Fg5%2FM00%2F0D%2F05%2FChMkJlnHskGIC8gjAAJBAWB0pxwAAgwNgI_jqMAAkEZ946.jpg"; //找到imgview控件
main_img1=(ImageView)findViewById(R.id.main_img1);
//传递参数,显示图片到控件上
ShowImage.displaydDfault(main_img1,urlx); main_img2=(ImageView)findViewById(R.id.main_img2);
ShowImage.displayCutR(main_img2,30,urlx); main_img3=(ImageView)findViewById(R.id.main_img3);
ShowImage.displayRoundness(main_img3,urlx);

参考:

https://github.com/wyouflf/xUtils3

https://blog.csdn.net/u014620028/article/details/51063377

安卓网络访问(xUtils3)的更多相关文章

  1. 已禁用对分布式事务管理器(MSDTC)的网络访问。请使用组件服务管理工具启用 DTC 以便在 MSDTC 安全配置中进行网络访问。

    今天写ASP.NET程序,在网页后台的c#代码里写了个事务,事务内部对一张表进行批量插入,对另外一张表进行查询与批量插入. 结果第二张表查询后foreach迭代操作时报错:已禁用对分布式事务管理器(M ...

  2. Android实现网络访问

    Android实现网络访问 开发工具:Andorid Studio 1.3 运行环境:Android 4.4 KitKat 工程内容 1) 熟练使用HttpURLConnection访问WebServ ...

  3. WebService只能在本地使用,无法通过网络访问的解决办法

    问题描述:WebService只能在本地使用,无法通过网络访问. 解决方案:在web.config的<system.web></system.web>中间加入如下配置节内容: ...

  4. docker网络-如何让外部网络访问容器资源

    docker网络-如何让外部网络访问容器资源 安装httpd 服务: docker:/root# docker exec -it f63b2633d146 bash bash-4.1# yum ins ...

  5. docker网络访问(三)

    docker网络访问 ifconfig查看网卡,启动docker的时候,docker会帮我们创建一个docker0的网桥. 1.随机映射 docker run -P 2.指定映射 -p hostPor ...

  6. Android开发9:网络访问&Web服务开发

    前言 啦啦啦各位小伙伴们好~ 一起进入我们今天的主题.今天我们将和大家学习网络访问和Web服务开发的相关知识,一起学习熟练使用 HttpURLConnection 访问 WebService,熟悉使用 ...

  7. iOS9 HTTP 网络访问问题

    今天升级Xcode 7.0 发现网络访问失败.输出错误信息 The resource could not be loaded because the App Transport Security po ...

  8. 【安卓网络请求开源框架Volley源码解析系列】定制自己的Request请求及Volley框架源码剖析

    通过前面的学习我们已经掌握了Volley的基本用法,没看过的建议大家先去阅读我的博文[安卓网络请求开源框架Volley源码解析系列]初识Volley及其基本用法.如StringRequest用来请求一 ...

  9. Volley手写属于自己的万能网络访问框架

    用户在调用层(Activity或Service中),发起一个网络请求,该请求肯定包含url,请求参数(requestParameter),以及我们需要给调用层提供一个请求成功或失败以后回调监听的接口d ...

随机推荐

  1. 在IE浏览器进行编辑操作再展示出现乱码问题

    解决方法: ajax传输数据时进行encodeURI编码就可以了 例如: 在其他浏览器中没有进行 encodeURI 直接传输,无问题. 然而,在IE10 和11中进行下面这段代码编辑后,再展示出来就 ...

  2. Handler processing failed; nested exception is java.lang.NoSuchMethodError: org.apache.commons.codec.digest.DigestUtils.sha1Hex(Ljava/lang/String;)Ljava/lang/String;

    异常:Handler processing failed; nested exception is java.lang.NoSuchMethodError: org.apache.commons.co ...

  3. Maximum Sum Circular Subarray LT918

    Given a circular array C of integers represented by A, find the maximum possible sum of a non-empty ...

  4. 【Java】基本数据类型

    基本知识点给个链接: https://blog.csdn.net/qwe969153746/article/details/53353534 问题: 1.3*0.1 == 0.3 返回什么: fals ...

  5. 《Linux就该这么学》第十天课程

    使用RAID与LVM磁盘阵列技术 有RAID 0,RAID 1,,RAID 5,RAID 1 0等,下面列举RAID的各个概况 1. RAID 0 RAID 0技术把多块物理硬盘设备(至少两块)通过硬 ...

  6. 89、instancetype和id的区别

    1>instancetype在类型表示上,跟id一样,可以表示任何对象类型 2>instancetype只能用在返回值类型上,不能像id一样用在参数类型上 3>instancetyp ...

  7. flink 读取kafka 数据,partition分配

    每个并发有个编号,只会读取kafka partition  % 总并发数 == 编号 的分区   如: 6 分区, 4个并发 分区: p0 p1 p2 p3 p4 p5 并发: 0 1 2 3    ...

  8. JPA-04

    一.JPQL JPA的查询语言(和SQL非常像,面向对象的查询语言) 有list集合可以用size看长度 分页:setFirstResult().setMaxResults(); 获取总条数:getS ...

  9. linux从0开始----01

    1.VMware 虚拟机安装与卸载 推荐安装较高版本,11.x以后的.本课程安装12.x版本,需要序列号. 2.在vmware中安装centos客户机.初学者选择典型安装也可以. 1.vware文件菜 ...

  10. 基于UML的时空建模

    一.基本信息 标题:基于UML的时空建模 时间:2018 出版源:东北大学学报(自然科学版) 领域分类:UML模型:RCC-8空间拓扑:Allen-13时态拓扑:时空数据:建模 二.研究背景 问题定义 ...