• 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     
    昔日我曾苍老,如今风华正茂(ง •̀_•́)ง
  • 相关阅读:
    杂谈:大容量(T级容量)的网盘的意义
    Direct2D教程VII——变换几何(TransformedGeometry)对象
    Direct2D教程VI——转换(Transform)
    yum回滚至Kubernetes1.15.7版本
    denied: requested access to the resource is denied
    Jenkins构建Vue项目
    修改kubelet启动参数
    http: TLS handshake error from x.x.x.x:43534: unexpected EOF
    Kubernetes 集群升级docker版本
    Nginx服务加到systemctl
  • 原文地址:https://www.cnblogs.com/lgqrlchinese/p/10022856.html
Copyright © 2020-2023  润新知