You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

请求指导:为OkHttpClient上传代码实现0-100%进度条

嘿,我明白你为啥困扰了——你现在用的ProgressDialog只是个转圈的提示,根本没设置成能显示百分比的水平进度条,而且也没和上传的实际进度挂钩对吧?别慌,我给你一步步解决:

实现上传进度条的具体方案

首先要明确两个核心点:把对话框改成可显示百分比的水平进度条样式,然后在上传过程中实时计算进度并更新UI。另外Android不能在主线程做网络操作,得用异步任务来处理。

第一步:修改ProgressDialog初始化

把你原来的对话框代码改成下面这样,开启水平进度条模式并设置进度范围:

private void upload_btn() {
    button_upload.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            progress = new ProgressDialog(UploaderActictivity.this);
            progress.setTitle("上传文章");
            progress.setMessage("请稍候...");
            // 关键:切换为水平进度条样式
            progress.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
            // 设置进度范围0-100
            progress.setMax(100);
            // 显示对话框
            progress.show();
            
            // 启动异步上传任务,传入你的文件路径
            new UploadTask().execute("/sdcard/your_file.txt");
        }
    });
}

第二步:实现带进度监听的异步上传任务

用AsyncTask处理上传逻辑,在上传过程中计算已上传字节占总字节的比例,转换成百分比后更新进度条:

private class UploadTask extends AsyncTask<String, Integer, Boolean> {

    @Override
    protected Boolean doInBackground(String... params) {
        String filePath = params[0];
        File uploadFile = new File(filePath);
        if (!uploadFile.exists()) {
            return false;
        }
        
        try {
            // 替换成你的实际上传接口地址
            URL uploadUrl = new URL("https://your-server.com/upload");
            HttpURLConnection conn = (HttpURLConnection) uploadUrl.openConnection();
            conn.setRequestMethod("POST");
            conn.setDoOutput(true);
            conn.setDoInput(true);
            
            // 设置请求头,告知服务器文件信息
            long totalFileSize = uploadFile.length();
            conn.setRequestProperty("Content-Length", String.valueOf(totalFileSize));
            conn.setRequestProperty("Content-Type", "multipart/form-data");
            
            OutputStream outputStream = conn.getOutputStream();
            FileInputStream fileInputStream = new FileInputStream(uploadFile);
            
            byte[] buffer = new byte[4096]; // 4KB缓冲区,提升上传效率
            long uploadedBytes = 0;
            int bytesRead;
            
            while ((bytesRead = fileInputStream.read(buffer)) != -1) {
                outputStream.write(buffer, 0, bytesRead);
                uploadedBytes += bytesRead;
                // 计算当前进度百分比
                int progressPercent = (int) ((uploadedBytes * 100) / totalFileSize);
                // 发布进度,触发UI线程更新
                publishProgress(progressPercent);
            }
            
            // 关闭流
            fileInputStream.close();
            outputStream.flush();
            outputStream.close();
            
            // 检查上传是否成功
            return conn.getResponseCode() == HttpURLConnection.HTTP_OK;
            
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }

    @Override
    protected void onProgressUpdate(Integer... values) {
        super.onProgressUpdate(values);
        // 在UI线程更新进度条
        progress.setProgress(values[0]);
    }

    @Override
    protected void onPostExecute(Boolean uploadSuccess) {
        super.onPostExecute(uploadSuccess);
        // 上传完成后关闭对话框,提示结果
        progress.dismiss();
        if (uploadSuccess) {
            Toast.makeText(UploaderActictivity.this, "上传成功!", Toast.LENGTH_SHORT).show();
        } else {
            Toast.makeText(UploaderActictivity.this, "上传失败,请重试", Toast.LENGTH_SHORT).show();
        }
    }
}

额外注意事项

  • 别忘了在AndroidManifest.xml里添加网络权限:<uses-permission android:name="android.permission.INTERNET" />
  • 如果是Android 6.0及以上版本,上传本地文件时需要动态申请文件读取权限
  • 如果你用OkHttp等第三方网络库,进度监听逻辑类似,核心都是计算「已上传字节/总字节」的比例来更新进度

这样改完之后,点击上传按钮就能看到进度条从0%平滑跳到100%啦!

内容的提问来源于stack exchange,提问作者HajAli

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 10:03:45