安卓使用okhttpfinal下载文件,附带线程池下载使用

news2025/2/28 12:11:25

1.导入okhttp包

implementation 'cn.finalteam:okhttpfinal:2.0.7'

2.单个下载

package com.example.downloading;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.util.Log;
import android.view.View;

import java.io.File;

import cn.finalteam.okhttpfinal.FileDownloadCallback;
import cn.finalteam.okhttpfinal.HttpRequest;
import cn.finalteam.okhttpfinal.OkHttpFinal;
import cn.finalteam.okhttpfinal.OkHttpFinalConfiguration;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //先初始化okhttp
        OkHttpFinalConfiguration.Builder builder = new OkHttpFinalConfiguration.Builder();
        OkHttpFinal.getInstance().init(builder.build());

        findViewById(R.id.Play_videos_and_pictures).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Download("https:...../2_0ee2238f8f8cd7b3773cc6d82dafb756.mp4",
                        new File("/storage/emulated/0/Download/2adfed77da173f.mp4"));
            }
        });
    }


    public static void Download(final String url, final File saveFile) {
        Log.e("TAG","url===="+url);
        Log.e("TAG","saveFile===="+saveFile.getAbsolutePath());
        HttpRequest.download(url, saveFile, new FileDownloadCallback() {
            //开始下载
            @Override
            public void onStart() {
                super.onStart();
            }

            //下载进度
            @Override
            public void onProgress(int progress, long networkSpeed) {
                super.onProgress(progress, networkSpeed);
                Log.e("TAG", "进度值是:" + progress);
            }

            //下载失败
            @Override
            public void onFailure() {
                super.onFailure();
                Log.e("TAG", "下载失败的地址是:" + url);
            }

            //下载完成(下载成功)
            @Override
            public void onDone() {
                super.onDone();
                Log.e("TAG", "成功下载的地址是:" + saveFile.getAbsolutePath());
            }
        });
    }
}

3.使用线程池下载 

package com.example.downloading;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.util.Log;
import android.view.View;

import java.io.File;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

import cn.finalteam.okhttpfinal.FileDownloadCallback;
import cn.finalteam.okhttpfinal.HttpRequest;
import cn.finalteam.okhttpfinal.OkHttpFinal;
import cn.finalteam.okhttpfinal.OkHttpFinalConfiguration;

public class MainActivity extends AppCompatActivity {


    private static ExecutorService executor;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        OkHttpFinalConfiguration.Builder builder = new OkHttpFinalConfiguration.Builder();
        OkHttpFinal.getInstance().init(builder.build());

        executor = Executors.newFixedThreadPool(5); // 创建一个拥有5个线程的线程池
        
        findViewById(R.id.Play_videos_and_pictures).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Showdownload("https:.........mp4",
                                "/storage/emulated/0/Download/2adfed77da173f.mp4");

            }
        });
    }


    public static void Download(final String url, final File saveFile) {
        Log.e("TAG","url===="+url);
        Log.e("TAG","saveFile===="+saveFile.getAbsolutePath());
        HttpRequest.download(url, saveFile, new FileDownloadCallback() {
            //开始下载
            @Override
            public void onStart() {
                super.onStart();
            }

            //下载进度
            @Override
            public void onProgress(int progress, long networkSpeed) {
                super.onProgress(progress, networkSpeed);
                Log.e("TAG", "进度值是:" + progress);
            }

            //下载失败
            @Override
            public void onFailure() {
                super.onFailure();
                Log.e("TAG", "下载失败的地址是:" + url);
            }

            //下载完成(下载成功)
            @Override
            public void onDone() {
                super.onDone();
                Log.e("TAG", "成功下载的地址是:" + saveFile.getAbsolutePath());
            }
        });
    }




    //设置多个下载
    private void Showdownload(String imageUrl, String imagepath) {
        //直接使用全局的线程池来执行下载任务,避免重复创建线程池
        for (int i1 = 0; i1 < 10; i1++) {
            executor.execute(new DownloadImageTask(imageUrl, imagepath));
        }
    }

    // 下载任务类
    class DownloadImageTask implements Runnable {
        private String imageUrl;
        private String imagepath;

        public DownloadImageTask(String imageUrl, String imagepath) {
            this.imageUrl = imageUrl;
            this.imagepath = imagepath;
        }

        @Override
        public void run() {
            // 使用网络请求库下载文件
            Download(imageUrl, new File(imagepath));
        }
    }



}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1477081.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

前端配置开发环境,新电脑配置前端开发环境,Vue开发环境配置的详细过程(前端开发环境配置,电脑重置后配置前端开发环境)

简介&#xff1a;有时候&#xff0c;我们需要在新电脑 或者 电脑重置后&#xff0c;配置前端开发环境&#xff0c;具体都需要安装什么软件和插件&#xff0c;这里来记录一下&#xff08;文章适合新手和小白&#xff0c;大佬可以带过&#xff09;。 ✨前端开发环境&#xff0c;需…

向量数据库PGVECTOR,AI浪潮下崛起的新秀!

&#x1f4e2;&#x1f4e2;&#x1f4e2;&#x1f4e3;&#x1f4e3;&#x1f4e3; 哈喽&#xff01;大家好&#xff0c;我是【IT邦德】&#xff0c;江湖人称jeames007&#xff0c;10余年DBA及大数据工作经验 一位上进心十足的【大数据领域博主】&#xff01;&#x1f61c;&am…

mybatis的原理和注解开发,今年Java面试必问的这些技术面

前言 说起MySQL优化的话&#xff0c;想必大部分人都不陌生了。在我们的记忆储备里也早已记住了这些关键词&#xff1a;避免使用SELECT*、避免使用NULL值的判断、根据需求适当的建立索引、优化MySQL参数…但是你对于这些优化技巧是否真正的掌握了及其相应的工作原理是否吃透了呢…

RabbitMQ-消息队列:Federation Exchange、Federation Queue、Shovel

25、Federation Exchange 1、使用它的原因 ​ (broker 北京)&#xff0c;(broker 深圳)彼此之间相距甚远&#xff0c;网络延迟是一个不得不面对的问题。有一个在北京 的业务(Client 北京) 需要连接(broker 北京)&#xff0c;向其中的交换器 exchangeA 发送消息&#xff0c;此…

思科湾区开启新一轮裁员,730职位受到影响 | 百能云芯

近日&#xff0c;科技巨头思科&#xff08;Cisco&#xff09;宣布将进行一轮裁员&#xff0c;作为其裁员计划的一部分&#xff0c;湾区将有大约730个工作岗位受到影响。 根据提交给州和地方官员的监管文件&#xff0c;受影响的工作岗位主要分布在湾区不同地点&#xff0c;其中圣…

QT多语言切换功能

一.目的 在做项目时&#xff0c;有时希望我们的程序可以在不同的国家使用&#xff0c;这样最好的方式是一套程序能适应于多国语言。 Qt提供了这样的功能&#xff0c;使得一套程序可以呈现出不同的语言界面。本文将介绍QT如何实现多语言&#xff0c;以中文和英文为例。 QT开发…

YOLOv8改进涨点,添加GSConv+Slim Neck,有效提升目标检测效果,代码改进(超详细)

目录 摘要 主要想法 GSConv GSConv代码实现 slim-neck slim-neck代码实现 yaml文件 完整代码分享 总结 摘要 目标检测是计算机视觉中重要的下游任务。对于车载边缘计算平台来说&#xff0c;巨大的模型很难达到实时检测的要求。而且&#xff0c;由大量深度可分离卷积层构…

Leetcode121. 买卖股票的最佳时机 -代码随想录

题目&#xff1a; 代码(首刷自解 2024年2月29日&#xff09;&#xff1a; 一个easy题做那么久&#xff0c;自我检讨一下 class Solution { public:int maxProfit(vector<int>& prices) {int n prices.size();if (n 1) return 0;vector<int> dp(n 1, 0);int…

Redis 在 Linux 系统下安装部署的两种方式详细说明

小伙伴们好&#xff0c;欢迎关注&#xff0c;一起学习&#xff0c;无限进步 Redis安装和配置 1、首先在官网下载好redis-6.0.9.tar.gzhttp://redis.io/ 或者使用 wget 命令下载&#xff1a;wget http://download.redis.io/releases/redis-6.0.9.tar.gz 2、下载使用上传到阿里…

《Spring Security 简易速速上手小册》第1章 Spring Security 概述(2024 最新版)

文章目录 1.1 Spring Security 的重要性1.1.1 基础知识详解1.1.2 主要案例&#xff1a;用户认证与授权1.1.3 拓展案例 1&#xff1a;OAuth2 社交登录1.1.4 拓展案例 2&#xff1a;JWT 认证 1.2 Spring Security 的核心特性1.2.1 基础知识详解1.2.2 主要案例&#xff1a;基于角色…

疑似某免杀测试样本被国外安全团队捕获

今天笔者发现国外MalwareHunterTeam捕获到一例特殊的样本&#xff0c;如下所示&#xff1a; 服务器的IP地址为:117.50.106.161&#xff0c;同时样本的PDB信息&#xff0c;如下所示&#xff1a; 样本的PDB信息&#xff1a;C:\Users\Xiaowu\source\repos\bypass-1\Release\bypass…

2.1_6 线程的实现方式和多线程模型

文章目录 2.1_6 线程的实现方式和多线程模型&#xff08;一&#xff09;线程的实现方式&#xff08;1&#xff09;用户级线程&#xff08;2&#xff09;内核级线程 &#xff08;二&#xff09;多线程模型&#xff08;1&#xff09;一对一模型&#xff08;2&#xff09;多对一模…

【element-ui】el-select multiple多选,表单校验问题解决方法

在项目开发过程中发现&#xff0c;el-select设置了multiple支持多选属性之后&#xff0c;el-select赋值之后&#xff0c;表单校验不通过 解决思路及解决方法&#xff1a; 1、首先看看v-model 、prop属性、rules校验是否正确&#xff0c;这里注意el-select的rules校验的trigger…

linux服务器调度数据库的存储过程

1、需要安装数据库的客户端 2、安装sqlplus 3、编写sh脚本 脚本内容如下&#xff1a; 4、设置调度任务

vue3使用百度地图实现个性化地图和轨迹

vue3使用百度地图实现个性化地图和轨迹 最终效果如图&#xff1a; 步骤如下&#xff1a; 一、百度地图在vue3中的引入 1.首先在百度地图开发中心中申请ak&#xff08;不多介绍&#xff09; 2.两种引入方式&#xff1a;在 index.html 中直接引入&#xff1b;使用npm导包。&…

MyBatis 学习(一)之 MyBatis 概述

目录 1 MyBatis 介绍 2 MyBatis 的重要组件 3 MyBatis 执行流程 4 参考文档 1 MyBatis 介绍 MyBatis 是一个半自动化的 ORM &#xff08;Object-Relational Mapping&#xff0c;对象关系映射&#xff09;持久层框架&#xff0c;它允许开发者通过 XML 或注解将对象与数据库中…

STM32进阶笔记——复位、时钟与滴答定时器

本专栏争取每周三更新直到更新完成&#xff0c;期待大家的订阅关注&#xff0c;欢迎互相学习交流。 目录 一、复位1.1 软件复位1.2 低功耗管理复位 二、时钟2.1 系统时钟(SYSCLK)选择2.2 系统时钟初始化 三、滴答定时器&#xff08;Systick&#xff09;3.1 SysTick部分寄存器3.…

docker中hyperf项目配置虚拟域名

在使用hyperf框架时&#xff0c;直接用了docker环境进行开发 下载镜像运行容器 docker run --name hyperf -v /data/project:/data/project -p 9501:9501 -itd -w /data/project --privileged -u root --entrypoint /bin/sh 镜像ID配置docker-compose.yml version: "3.…

python-产品篇-图形验证码

文章目录 准备代码效果 准备 代码 from tkinter import * from tkinter.messagebox import * import time import os root Tk() import random dirall[] randima []def call():global image1global image2global image3global image4global image5global seloneglobal …

sawForceDimensionSDK安装,sigma7+ros

force dimension的sdk中没有关于ros&#xff0c;借助开源的sawForceDimensionSDK实现对于数据的封装和可视化&#xff0c;方便后续使用 链接&#xff1a; GitHub - jhu-saw/sawForceDimensionSDK 具体步骤&#xff1a; 安装qt和ros&#xff0c;官网下载Force Dimension SDK …