Android基于开源项目xutils3实现下载

作者:龙谷情Sinoam 时间:2023-05-06 06:24:15 

上一次自己写了一个多线程断点续传下载的demo,过于麻烦,bug超多,所以我学习使用xutils来完成此功能。

先将xutils依赖搭建好(上一篇博客已经具体写了方法)

先看看效果图:

Android基于开源项目xutils3实现下载Android基于开源项目xutils3实现下载

下面开始代码的逻辑:

在xutils3以前使用HttpUtils新建对象即可使用,3以后取消了HttpUtils,具体方法请看代码。

首先创建布局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;
 //动态获取权限
 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);
   //动态获取权限
   verifyStoragePermissions(this);

x.view().inject(this);

et_path = findViewById(R.id.et_path);
   pb = findViewById(R.id.progressBar);

}

//点击按钮下载(断点续传)
 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代表当前进度
       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");

}
   });

}
 //动态获取权限
 public static void verifyStoragePermissions(Activity activity) {

try {
     //检测是否有写的权限
     int permission = ActivityCompat.checkSelfPermission(activity,
         "android.permission.WRITE_EXTERNAL_STORAGE");
     if (permission != PackageManager.PERMISSION_GRANTED) {
       // 没有写的权限,去申请写的权限,会弹出对话框
       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,因为下载的是一个文件,否则文件不会下载下来。

还要加上权限:


<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" />

来源:https://www.cnblogs.com/lgqrlchinese/p/10022856.html

标签:android,xutils3,下载
0
投稿

猜你喜欢

  • 详解springcloud Feign的Hystrix支持

    2022-07-08 20:15:13
  • android开发基础教程—三种方式实现xml文件解析

    2021-06-21 21:24:25
  • 解决java.lang.ClassCastException的java类型转换异常的问题

    2023-11-29 04:34:10
  • Android Flutter实现仿闲鱼动画效果

    2023-07-15 15:32:47
  • SpringCloud Feign多参数传递及需要注意的问题

    2022-05-25 11:11:58
  • springboot 参数格式校验操作

    2023-10-16 08:53:32
  • Android本地实现搜索历史记录

    2023-08-15 22:25:17
  • 代码详解Java猴子选王问题(约瑟夫环)

    2023-09-16 07:33:43
  • Java如何实现登录token令牌

    2022-05-19 16:58:11
  • C#实现FTP传送文件的示例

    2022-06-24 01:15:20
  • Unity 使用TexturePacker打包图集的操作方法

    2021-08-30 18:48:17
  • Android编程之动态壁纸实例分析

    2023-02-23 07:05:15
  • Java 反射机制知识详细介绍及总结

    2023-12-15 01:08:15
  • Java开发Oracle数据库连接JDBC Thin Driver 的三种方法

    2022-05-08 09:40:50
  • Android GPS定位测试(附效果图和示例)

    2023-05-11 17:38:10
  • MyBatis 动态拼接Sql字符串的问题

    2021-08-09 05:23:46
  • Java中泛型的示例详解

    2023-10-27 02:54:24
  • Android通过LIstView显示文件列表的两种方法介绍

    2022-05-26 00:00:39
  • Java 判断线程池所有任务是否执行完毕的操作

    2021-10-03 09:43:55
  • SSM框架+Plupload实现分块上传大文件示例

    2023-06-01 01:58:21
  • asp之家 软件编程 m.aspxhome.com