安卓网络访问(xUtils3)
xUtils3是安卓网络访问的重要库,基本上的网络请求所涉及的内容都有集成。笔者将实现xUtils3的简单使用,包括简单GET和POST请求、文件上传、文件下载、图片显示。
其主要特性有以下几点:
①提供异步网络请求
②支持超大文件(超过2G)上传
③有了强大的HTTP及其下载缓存的支持,支持文件断点续传
④全面的HTTP请求协议支持(GET,POST等)
⑤图片绑定支持gif(受系统兼容性影响,部分gif文件只能静态显示),支持圆角、圆形、方形显示图片,支持图片裁剪,支持自动旋转
初始化工作:
添加依赖
1 compile \'org.xutils:xutils:3.4.0\'
新建初始化类
新建一个类:Xutilsinit,将新建的类放在MainActivity同级目录下(同一个包下)即可
1 import org.xutils.x; 2 class Xutilsinit extends Application { 3 @Override 4 public void onCreate() { 5 super.onCreate(); 6 x.Ext.init(this); 7 x.Ext.setDebug(true);//是否输出Debug日志 8 } 9 }
必要权限获取及类声明
在AndroidManifest.xml,第一个权限为网络访问权限,第二个为文件读写权限,文件读写权限在某些手机上是需要另外手动获取,否则将影响文件的上传和下载功能。
1 <uses-permission android:name="android.permission.INTERNET" /> 2 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
简单的GET和POST请求实现:
不用自己另起线程,直接在主线程写就好了,框架实现了线程访问。
1 /设置需要访问的URL 2 String url="http://193.112.87.88/library/user_login.php"; 3 4 5 //设置post表单数据,以键值对设置 6 RequestParams params =new RequestParams(url); 7 params.addBodyParameter("account","164"); 8 params.addBodyParameter("password","dong"); 9 10 //简单的加载提示框 11 final ProgressDialog dia=new ProgressDialog(MainActivity.this); 12 dia.setMessage("东小东加载中……"); 13 dia.show(); 14 15 //开始网络访问 16 //如果是get请求,则x.http().get(params, new Callback.CommonCallback<String>() 即可 17 x.http().post(params, new Callback.CommonCallback<String>() { 18 @Override 19 public void onSuccess(String result) { 20 //访问成功时进入,得到访问返回的数据 21 Toast.makeText(x.app(),"东小东提示获取的数据为:"+ result, Toast.LENGTH_LONG).show(); 22 System.out.println("获取到的数据是"+result); 23 24 } 25 26 @Override 27 public void onError(Throwable ex, boolean isOnCallback) { 28 //请求错误进入 29 Toast.makeText(x.app(),"东小东提示:请求错误", Toast.LENGTH_LONG).show(); 30 31 } 32 33 @Override 34 public void onCancelled(Callback.CancelledException cex) { 35 ////主动调用取消请求的回调方法 36 } 37 38 @Override 39 public void onFinished() { 40 //访问结束时进入,停止加载框 41 dia.dismiss(); 42 } 43 });
POST文件上传:
利用POST提交表单的形式进行文件上传,其中params.setMultipart(true);是表示使用二进制的方式上传数据,需要进行文件上传时必须加入这句。
1 //设置需要访问的URL 2 String url="http://193.112.87.55/file1.php"; 3 4 5 //设置post表单数据,以键值对设置 6 RequestParams params =new RequestParams(url); 7 params.setMultipart(true); 8 params.addBodyParameter("yzm","112233"); 9 10 //File filex= new File(Environment.getExternalStorageDirectory()+"/东小东.jpg"); 11 // params.addBodyParameter("img", filex, "multipart/form-data","dongxiaodong.jpg");//其中dongxiaodong.jpg为重命名 12 13 //生成文件对象,需要绝对路径 14 File filex= new File(Environment.getExternalStorageDirectory()+"/gg.mp3"); 15 params.addBodyParameter("img", filex, "multipart/form-data");//保留文件原名 16 17 18 //简单的加载提示框 19 final ProgressDialog dia=new ProgressDialog(MainActivity.this); 20 dia.setMessage("东小东加载中……"); 21 dia.show(); 22 23 //开始网络访问 24 x.http().post(params, new Callback.CommonCallback<String>() { 25 @Override 26 public void onSuccess(String result) { 27 //访问成功时进入,得到访问返回的数据 28 Toast.makeText(x.app(),"东小东提示获取的数据为:"+ result, Toast.LENGTH_LONG).show(); 29 System.out.println("获取到的数据是"+result); 30 31 } 32 33 @Override 34 public void onError(Throwable ex, boolean isOnCallback) { 35 //请求错误进入 36 Toast.makeText(x.app(),"东小东提示:请求错误", Toast.LENGTH_LONG).show(); 37 38 } 39 40 @Override 41 public void onCancelled(Callback.CancelledException cex) { 42 ////主动调用取消请求的回调方法 43 Toast.makeText(x.app(),"东小东提示:已取消请求", Toast.LENGTH_LONG).show(); 44 } 45 46 @Override 47 public void onFinished() { 48 //访问结束时进入,停止加载框 49 Toast.makeText(x.app(),"东小东提示:完成请求", Toast.LENGTH_LONG).show(); 50 dia.dismiss(); 51 } 52 });
文件下载实现:
文件下载时使用异步任务进行的,其还实现了断点续传功能,观看下载文件夹可了解到下载时会自动生成一个缓存文件存放下载内容。基本判断应该是下次下载时会将下载文件与缓存文件进行对比,而实现断点续传功能。
1 private void downloadUpdateApk() { 2 if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) { 3 4 //简单的加载提示框 5 final ProgressDialog dia=new ProgressDialog(MainActivity.this); 6 dia.setMessage("东小东马上下载中........"); 7 dia.show(); 8 9 //下载地址 10 RequestParams requestParams = new RequestParams("http://193.112.87.88/filexxx/gg.mp3"); 11 // 文件下载后的保存路径及文件名 12 requestParams.setSaveFilePath(Environment.getExternalStorageDirectory()+"/dongxiaodong/东小东.mp3"); 13 // 下载完成后自动为文件命名 14 requestParams.setAutoRename(false); 15 //下载请求 16 x.http().get(requestParams, new Callback.ProgressCallback<File>() { 17 18 @Override 19 public void onSuccess(File result) { 20 //倒数第二调用 21 Toast.makeText(MainActivity.this,"下载完成",Toast.LENGTH_SHORT).show(); 22 System.out.println("---------------下载完成---------------------------"); 23 dia.setMessage("东小东下载完成**"); 24 } 25 26 @Override 27 public void onError(Throwable ex, boolean isOnCallback) { 28 Toast.makeText(MainActivity.this,"下载失败",Toast.LENGTH_SHORT).show(); 29 System.out.println("---------------下载失败---------------------------"); 30 31 } 32 33 @Override 34 public void onCancelled(CancelledException cex) { 35 36 Toast.makeText(MainActivity.this,"取消下载",Toast.LENGTH_SHORT).show(); 37 System.out.println("---------------取消下载---------------------------"); 38 } 39 40 @Override 41 public void onFinished() { 42 //最后调用 43 Toast.makeText(MainActivity.this,"下载结束",Toast.LENGTH_SHORT).show(); 44 System.out.println("---------------下载结束---------------------------"); 45 dia.dismiss(); 46 47 } 48 49 @Override 50 public void onWaiting() { 51 // 最开始调用 52 Toast.makeText(MainActivity.this,"等待下载",Toast.LENGTH_SHORT).show(); 53 System.out.println("---------------等待下载---------------------------"); 54 55 } 56 57 @Override 58 public void onStarted() { 59 //第二调用 60 Toast.makeText(MainActivity.this,"开始下载",Toast.LENGTH_SHORT).show(); 61 System.out.println("---------------开始下载---------------------------"); 62 dia.setMessage("东小东下载开始----"); 63 } 64 65 @Override 66 public void onLoading(long total, long current, boolean isDownloading) { 67 // 当前的下载进度和文件总大小 68 // 下载的时候不断回调的方法 69 //参数:总大小,已经下载的大小,是否正在下载 70 System.out.println("***"+total+"********"+current+"****************"+isDownloading+"**********"); 71 //百分比为整数 72 System.out.println("下载进度为:"+(int)(((float)current/total)*100)+"%"); 73 //百分比为小数 74 dia.setMessage("东小东下载进度为:"+((float)current/total)*100+"%"); 75 76 } 77 }); 78 } 79 80 }
图片显示:
ImageOptions是强大的网络图片加载显示的工具类,可以实现图片的缓存、图片的直角、圆角、圆形显示及图片的裁剪,另外还支持gif动态显示。
显示效果
图片显示封装类
1 import android.widget.ImageView; 2 import org.xutils.common.util.DensityUtil; 3 import org.xutils.image.ImageOptions; 4 import org.xutils.x; 5 6 /** 7 * Created by 东东 on 2018/12/29. 8 */ 9 public class ShowImage { 10 11 //显示默认图片,参数(图片控件,图片地址),地址可为网络或本地地址 12 public static void displaydDfault(ImageView imageView, String iconUrl) { 13 ImageOptions imageOptions = new ImageOptions.Builder() 14 .setIgnoreGif(false)//是否忽略gif图。false表示不忽略。不写这句,默认是true 15 .setImageScaleType(ImageView.ScaleType.CENTER_CROP) 16 .setIgnoreGif(false)//是否忽略gif图,false表示不忽略,不写这句,默认是true 17 .setUseMemCache(true)//是否支持缓存 18 .setFailureDrawableId(R.mipmap.ic_launcher)//设置加载失败显示的图片 19 .setLoadingDrawableId(R.mipmap.ic_launcher)//设置加载中显示的图片 20 .build(); 21 x.image().bind(imageView, iconUrl,imageOptions); 22 } 23 24 //显示圆角图片,参数(图片控件,圆角半径,图片地址),地址可为网络或本地地址 25 //圆角半径,100为圆形 26 public static void displayCutR(ImageView imageView, int radius, String iconUrl) { 27 ImageOptions imageOptions = new ImageOptions.Builder() 28 // .setSize(DensityUtil.dip2px(120), DensityUtil.dip2px(120))//图片大小 29 .setImageScaleType(ImageView.ScaleType.CENTER_CROP) 30 .setRadius(DensityUtil.dip2px(radius)) 31 .setIgnoreGif(false)//是否忽略gif图,false表示不忽略,不写这句,默认是true 32 .setCrop(true)//是否对图片进行裁剪 33 .setFailureDrawableId(R.mipmap.ic_launcher) 34 .setLoadingDrawableId(R.mipmap.ic_launcher) 35 .build(); 36 x.image().bind(imageView, iconUrl, imageOptions); 37 } 38 39 40 //显示圆形图片,参数(图片控件,图片地址),地址可为网络或本地地址 41 public static void displayRoundness(ImageView imageView, String iconUrl) { 42 ImageOptions imageOptions = new ImageOptions.Builder() 43 .setImageScaleType(ImageView.ScaleType.CENTER_CROP) 44 .setCircular(true)//显示圆形,半径根据控件控制 45 .setCrop(true) 46 .setIgnoreGif(false)//是否忽略gif图,false表示不忽略,不写这句,默认是true 47 .setLoadingDrawableId(R.mipmap.ic_launcher) 48 .setFailureDrawableId(R.mipmap.ic_launcher) 49 .build(); 50 x.image().bind(imageView, iconUrl, imageOptions); 51 } 52 }
在需要显示中使用
1 //图片地址 2 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"; 3 4 //找到imgview控件 5 main_img1=(ImageView)findViewById(R.id.main_img1); 6 //传递参数,显示图片到控件上 7 ShowImage.displaydDfault(main_img1,urlx); 8 9 main_img2=(ImageView)findViewById(R.id.main_img2); 10 ShowImage.displayCutR(main_img2,30,urlx); 11 12 13 main_img3=(ImageView)findViewById(R.id.main_img3); 14 ShowImage.displayRoundness(main_img3,urlx);
参考:
https://github.com/wyouflf/xUtils3
https://blog.csdn.net/u014620028/article/details/51063377