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多線程中線程池ThreadPool的原理和使用
本篇文章給大家通過原理和實例詳細講述了Android多線程中線程池ThreadPool的原理和使用,對此有興趣的朋友可以跟著參考學(xué)習(xí)下。2018-04-04
flutter 路由跳轉(zhuǎn)的實現(xiàn)示例
這篇文章主要介紹了flutter 路由跳轉(zhuǎn)的實現(xiàn)示例,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-08-08
Android Studio實現(xiàn)登錄功能案例講解
這篇文章主要介紹了Android Studio實現(xiàn)登錄功能案例講解,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下2021-08-08
Android組件Glide實現(xiàn)圖片平滑滾動效果
這篇文章主要介紹了Android組件Glide實現(xiàn)圖片平滑滾動效果的相關(guān)資料,具有一定的參考價值,需要的朋友可以參考下2016-07-07
詳解Android實現(xiàn)購物車頁面及購物車效果(點擊動畫)
本篇文章主要介紹了詳解Android實現(xiàn)購物車頁面及購物車效果(點擊動畫),非常具有實用價值,需要的朋友可以參考下2017-08-08
Android 啟動另一個App/apk中的Activity實現(xiàn)代碼
這篇文章主要介紹了Android 啟動另一個App/apk中的Activity實現(xiàn)代碼的相關(guān)資料,需要的朋友可以參考下2017-04-04

