首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

在android中下载文件的进度条

在Android中下载文件的进度条可以通过使用AsyncTask或者OkHttp库来实现。以下是一个示例代码:

  1. 使用AsyncTask实现下载文件的进度条:
代码语言:java
复制
import android.app.ProgressDialog;
import android.content.Context;
import android.os.AsyncTask;
import android.os.Environment;
import android.util.Log;

import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;

public class DownloadTask extends AsyncTask<String, Integer, String> {
    private Context context;
    private ProgressDialog progressDialog;

    public DownloadTask(Context context) {
        this.context = context;
    }

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        progressDialog = new ProgressDialog(context);
        progressDialog.setMessage("Downloading file...");
        progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
        progressDialog.setCancelable(false);
        progressDialog.show();
    }

    @Override
    protected String doInBackground(String... params) {
        String fileUrl = params[0];
        String fileName = params[1];
        String filePath = Environment.getExternalStorageDirectory().getPath() + "/" + fileName;

        try {
            URL url = new URL(fileUrl);
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
            connection.connect();

            int fileLength = connection.getContentLength();

            InputStream input = new BufferedInputStream(url.openStream());
            FileOutputStream output = new FileOutputStream(filePath);

            byte[] data = new byte[1024];
            long total = 0;
            int count;
            while ((count = input.read(data)) != -1) {
                total += count;
                publishProgress((int) (total * 100 / fileLength));
                output.write(data, 0, count);
            }

            output.flush();
            output.close();
            input.close();
        } catch (Exception e) {
            Log.e("DownloadTask", "Error: " + e.getMessage());
        }

        return filePath;
    }

    @Override
    protected void onProgressUpdate(Integer... values) {
        super.onProgressUpdate(values);
        progressDialog.setProgress(values[0]);
    }

    @Override
    protected void onPostExecute(String filePath) {
        super.onPostExecute(filePath);
        progressDialog.dismiss();
        // 下载完成后的操作,例如打开文件等
    }
}

使用方法:

代码语言:java
复制
DownloadTask downloadTask = new DownloadTask(context);
downloadTask.execute(fileUrl, fileName);
  1. 使用OkHttp库实现下载文件的进度条:

首先,添加OkHttp库的依赖到你的项目中。

代码语言:groovy
复制
implementation 'com.squareup.okhttp3:okhttp:4.9.1'

然后,使用以下代码实现下载文件的进度条:

代码语言:java
复制
import android.app.ProgressDialog;
import android.content.Context;
import android.os.Environment;
import android.util.Log;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;

import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;

public class DownloadManager {
    private Context context;
    private ProgressDialog progressDialog;

    public DownloadManager(Context context) {
        this.context = context;
    }

    public void downloadFile(String fileUrl, String fileName) {
        progressDialog = new ProgressDialog(context);
        progressDialog.setMessage("Downloading file...");
        progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
        progressDialog.setCancelable(false);
        progressDialog.show();

        OkHttpClient client = new OkHttpClient();
        Request request = new Request.Builder()
                .url(fileUrl)
                .build();

        client.newCall(request).enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
                Log.e("DownloadManager", "Error: " + e.getMessage());
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
                if (!response.isSuccessful()) {
                    throw new IOException("Unexpected code " + response);
                }

                InputStream input = response.body().byteStream();
                long fileLength = response.body().contentLength();

                File outputFile = new File(Environment.getExternalStorageDirectory(), fileName);
                FileOutputStream output = new FileOutputStream(outputFile);

                byte[] data = new byte[1024];
                long total = 0;
                int count;
                while ((count = input.read(data)) != -1) {
                    total += count;
                    publishProgress((int) (total * 100 / fileLength));
                    output.write(data, 0, count);
                }

                output.flush();
                output.close();
                input.close();
            }
        });
    }

    private void publishProgress(int progress) {
        progressDialog.setProgress(progress);
    }
}

使用方法:

代码语言:java
复制
DownloadManager downloadManager = new DownloadManager(context);
downloadManager.downloadFile(fileUrl, fileName);

以上是在Android中实现下载文件的进度条的示例代码。在实际使用中,你需要根据自己的需求进行适当的修改和优化。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

6分22秒

17-在idea中能够创建mybatis核心配置文件和映射文件的模板

34分48秒

104-MySQL目录结构与表在文件系统中的表示

3分41秒

21_尚硅谷_MyBatis_在idea中设置映射文件的模板

13分7秒

20_尚硅谷_MyBatis_在idea中设置核心配置文件的模板

12分24秒

03.尚硅谷_Fresco_例子_带进度条的图片.avi

12分24秒

03.例子_带进度条的图片.avi

8分18秒

day03_56_尚硅谷_硅谷p2p金融_自定义圆形进度条的圆弧绘制

11分36秒

day03_57_尚硅谷_硅谷p2p金融_自定义圆形进度条的文本绘制

20分50秒

day03_58_尚硅谷_硅谷p2p金融_使用自定义属性设置圆形进度条的显示

13分30秒

15_SDK的文件目录结构.avi

7分1秒

Split端口详解

3分53秒

13_APK安装文件的组成结构.avi

领券