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