android使用開源項目xutils3完成下載


上一次自己寫了一個多線程斷點續傳下載的demo,過於麻煩,bug超多,所以我學習使用xutils來完成此功能。

先將xutils依賴搭建好(上一篇博客已經具體寫了方法)

先看看效果圖:

下面開始代碼的邏輯:

在xutils3以前使用HttpUtils新建對象即可使用,3以后取消了HttpUtils,具體方法請看代碼。

首先創建布局activity_main.xml:

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 3     xmlns:tools="http://schemas.android.com/tools"
 4     android:layout_width="match_parent"
 5     android:layout_height="match_parent"
 6     android:orientation="vertical"
 7     tools:context=".MainActivity">
 8 
 9     <EditText
10         android:id="@+id/et_path"
11         android:layout_width="match_parent"
12         android:layout_height="wrap_content"
13         android:hint="請輸入下載路徑"
14         android:text="http://10.173.29.234/gp.apk" />
15 
16     <Button
17         android:layout_width="wrap_content"
18         android:layout_height="wrap_content"
19         android:text="下載"
20         android:onClick="click"/>
21 
22     <ProgressBar
23         android:id="@+id/progressBar"
24         style="?android:attr/progressBarStyleHorizontal"
25         android:layout_width="match_parent"
26         android:layout_height="wrap_content" />
27 
28 </LinearLayout>

然后MainActivity.java:

  1 import android.app.Activity;
  2 import android.content.pm.PackageManager;
  3 import android.support.v4.app.ActivityCompat;
  4 import android.support.v7.app.AppCompatActivity;
  5 import android.os.Bundle;
  6 import android.view.View;
  7 import android.widget.EditText;
  8 import android.widget.ProgressBar;
  9 import android.widget.Toast;
 10 
 11 import org.xutils.common.Callback;
 12 import org.xutils.http.RequestParams;
 13 import org.xutils.x;
 14 
 15 import java.io.File;
 16 
 17 public class MainActivity extends AppCompatActivity {
 18 
 19     private EditText et_path;
 20     private ProgressBar pb;
 21     //動態獲取權限
 22     private static final int REQUEST_EXTERNAL_STORAGE = 1;
 23     private static String[] PERMISSIONS_STORAGE = {
 24             "android.permission.READ_EXTERNAL_STORAGE",
 25             "android.permission.WRITE_EXTERNAL_STORAGE" };
 26     private String fileName;
 27     private String appName;
 28 
 29     @Override
 30     protected void onCreate(Bundle savedInstanceState) {
 31         super.onCreate(savedInstanceState);
 32         setContentView(R.layout.activity_main);
 33         //動態獲取權限
 34         verifyStoragePermissions(this);
 35 
 36         x.view().inject(this);
 37 
 38         et_path = findViewById(R.id.et_path);
 39         pb = findViewById(R.id.progressBar);
 40 
 41 
 42     }
 43 
 44     //點擊按鈕下載(斷點續傳)
 45     public void click(View view) {
 46 
 47         //拿到路徑
 48         String path = et_path.getText().toString().trim();
 49         fileName = getFileName(path);
 50         RequestParams params = new RequestParams(path);
 51         params.setSaveFilePath(fileName);
 52         params.setAutoRename(true);
 53         x.http().get(params, new Callback.ProgressCallback<File>() {
 54 
 55             @Override
 56             public void onWaiting() {
 57 
 58             }
 59 
 60             @Override
 61             public void onStarted() {
 62 
 63             }
 64 
 65             @Override
 66             public void onLoading(long total, long current, boolean isDownloading) {
 67                 //totle代表總進度,current代表當前進度
 68                 pb.setMax((int) total);
 69                 pb.setProgress((int) current);
 70                 System.out.println("測試1");
 71 
 72             }
 73 
 74 
 75             @Override
 76             public void onSuccess(File result) {
 77                 System.out.println("下載完成");
 78                 Toast.makeText(getApplicationContext(), "下載成功", Toast.LENGTH_SHORT).show();
 79 
 80             }
 81 
 82             @Override
 83             public void onError(Throwable ex, boolean isOnCallback) {
 84                 System.out.println("測試2");
 85 
 86             }
 87 
 88             @Override
 89             public void onCancelled(CancelledException cex) {
 90                 System.out.println("測試3");
 91 
 92             }
 93 
 94             @Override
 95             public void onFinished() {
 96                 System.out.println("測試4");
 97 
 98             }
 99         });
100 
101 
102     }
103     //動態獲取權限
104     public static void verifyStoragePermissions(Activity activity) {
105 
106         try {
107             //檢測是否有寫的權限
108             int permission = ActivityCompat.checkSelfPermission(activity,
109                     "android.permission.WRITE_EXTERNAL_STORAGE");
110             if (permission != PackageManager.PERMISSION_GRANTED) {
111                 // 沒有寫的權限,去申請寫的權限,會彈出對話框
112                 ActivityCompat.requestPermissions(activity, PERMISSIONS_STORAGE,REQUEST_EXTERNAL_STORAGE);
113             }
114         } catch (Exception e) {
115             e.printStackTrace();
116         }
117     }
118     //獲取文件名-->"http://10.173.29.234/test.exe"
119     public String getFileName(String path) {
120         int start = path.lastIndexOf("/") + 1;
121         appName = path.substring(start);
122 //        String fileName = Environment.getExternalStorageDirectory().getPath()+"/"+subString;
123         String fileName = "/sdcard/file/"+ appName;
124         return fileName;
125 
126     }
127 }

第53行注意x.http().get(params, new Callback.ProgressCallback<File>(){};<>中要寫File,因為下載的是一個文件,否則文件不會下載下來。

還要加上權限:

1  <uses-permission android:name="android.permission.INTERNET" />
2     <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
3     <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
4     

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM