Android基于開源項目xutils3實現(xiàn)下載
上一次自己寫了一個多線程斷點續(xù)傳下載的demo,過于麻煩,bug超多,所以我學(xué)習(xí)使用xutils來完成此功能。
先將xutils依賴搭建好(上一篇博客已經(jīng)具體寫了方法)
先看看效果圖:
下面開始代碼的邏輯:
在xutils3以前使用HttpUtils新建對象即可使用,3以后取消了HttpUtils,具體方法請看代碼。
首先創(chuàng)建布局activity_main.xml:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context=".MainActivity"> <EditText android:id="@+id/et_path" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="請輸入下載路徑" android:text="http://10.173.29.234/gp.apk" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="下載" android:onClick="click"/> <ProgressBar android:id="@+id/progressBar" style="?android:attr/progressBarStyleHorizontal" android:layout_width="match_parent" android:layout_height="wrap_content" /> </LinearLayout>
然后MainActivity.java:
import android.app.Activity; import android.content.pm.PackageManager; import android.support.v4.app.ActivityCompat; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.EditText; import android.widget.ProgressBar; import android.widget.Toast; import org.xutils.common.Callback; import org.xutils.http.RequestParams; import org.xutils.x; import java.io.File; public class MainActivity extends AppCompatActivity { private EditText et_path; private ProgressBar pb; //動態(tài)獲取權(quán)限 private static final int REQUEST_EXTERNAL_STORAGE = 1; private static String[] PERMISSIONS_STORAGE = { "android.permission.READ_EXTERNAL_STORAGE", "android.permission.WRITE_EXTERNAL_STORAGE" }; private String fileName; private String appName; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //動態(tài)獲取權(quán)限 verifyStoragePermissions(this); x.view().inject(this); et_path = findViewById(R.id.et_path); pb = findViewById(R.id.progressBar); } //點擊按鈕下載(斷點續(xù)傳) public void click(View view) { //拿到路徑 String path = et_path.getText().toString().trim(); fileName = getFileName(path); RequestParams params = new RequestParams(path); params.setSaveFilePath(fileName); params.setAutoRename(true); x.http().get(params, new Callback.ProgressCallback<File>() { @Override public void onWaiting() { } @Override public void onStarted() { } @Override public void onLoading(long total, long current, boolean isDownloading) { //totle代表總進度,current代表當(dāng)前進度 pb.setMax((int) total); pb.setProgress((int) current); System.out.println("測試1"); } @Override public void onSuccess(File result) { System.out.println("下載完成"); Toast.makeText(getApplicationContext(), "下載成功", Toast.LENGTH_SHORT).show(); } @Override public void onError(Throwable ex, boolean isOnCallback) { System.out.println("測試2"); } @Override public void onCancelled(CancelledException cex) { System.out.println("測試3"); } @Override public void onFinished() { System.out.println("測試4"); } }); } //動態(tài)獲取權(quán)限 public static void verifyStoragePermissions(Activity activity) { try { //檢測是否有寫的權(quán)限 int permission = ActivityCompat.checkSelfPermission(activity, "android.permission.WRITE_EXTERNAL_STORAGE"); if (permission != PackageManager.PERMISSION_GRANTED) { // 沒有寫的權(quán)限,去申請寫的權(quán)限,會彈出對話框 ActivityCompat.requestPermissions(activity, PERMISSIONS_STORAGE,REQUEST_EXTERNAL_STORAGE); } } catch (Exception e) { e.printStackTrace(); } } //獲取文件名-->"http://10.173.29.234/test.exe" public String getFileName(String path) { int start = path.lastIndexOf("/") + 1; appName = path.substring(start); // String fileName = Environment.getExternalStorageDirectory().getPath()+"/"+subString; String fileName = "/sdcard/file/"+ appName; return fileName; } }
第53行注意x.http().get(params, new Callback.ProgressCallback<File>(){};<>中要寫File,因為下載的是一個文件,否則文件不會下載下來。
還要加上權(quán)限:
<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Android實現(xiàn)讀寫JSON數(shù)據(jù)的方法
這篇文章主要介紹了Android實現(xiàn)讀寫JSON數(shù)據(jù)的方法,以完整實例形式分析了Android解析及生成json數(shù)據(jù)的相關(guān)技巧,具有一定參考借鑒價值,需要的朋友可以參考下2015-10-10解決Eclipse創(chuàng)建android項目無法正常預(yù)覽布局文件問題的方法
這篇文章主要介紹了解決Eclipse創(chuàng)建android項目無法正常預(yù)覽布局文件問題的方法,需要的朋友可以參考下2015-12-12Anroid四大組件service之本地服務(wù)的示例代碼
本篇文章主要介紹了Anroid四大組件service之本地服務(wù)的示例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-10-10Android即時通訊設(shè)計(騰訊IM接入和WebSocket接入)
本文主要介紹了Android即時通訊設(shè)計(騰訊IM接入和WebSocket接入),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-04-04Android中自定義view實現(xiàn)側(cè)滑效果
這篇文章主要介紹了Android中自定義view實現(xiàn)側(cè)滑效果的相關(guān)資料,非常不錯,具有參考借鑒價值,需要的朋友可以參考下2016-11-11RecyclerView中使用CheckBox出現(xiàn)勾選混亂的解決方法
這篇文章主要為大家詳細介紹了RecyclerView中使用CheckBox出現(xiàn)勾選混亂的解決方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-12-12Android開發(fā)之?dāng)?shù)據(jù)的存儲方式詳解
本篇文章主要介紹了Android開發(fā)之?dāng)?shù)據(jù)的存儲方式,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧。2016-11-11