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

如何将Chaquopy Python中的文件下载进度传递到Android Java

在Chaquopy中实现Python下载进度传递到Java

可行方案:通过Java回调对象直接传递进度

Chaquopy原生支持Python与Java的对象互操作,你可以直接将Java的回调实例传递给Python,在Python的下载进度回调中调用Java方法传递百分比。


步骤1:Java端定义回调接口并实现

首先在Java中定义一个进度更新的接口,然后在Activity中实现该接口(注意UI更新需切换到主线程):

// 定义进度回调接口
public interface DownloadProgressCallback {
    void onProgressUpdate(int percent);
}

// 在Activity中实现接口
public class MainActivity extends AppCompatActivity implements DownloadProgressCallback {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // 初始化Python环境,获取下载模块并传入回调实例
        Python python = Python.getInstance();
        PyObject downloadModule = python.getModule("download_script");
        downloadModule.callAttr("start_download", this);
    }

    @Override
    public void onProgressUpdate(int percent) {
        // 切换到主线程更新UI(比如进度条、文本)
        runOnUiThread(() -> {
            // 示例:更新进度条
            // progressBar.setProgress(percent);
            Log.d("Download", "当前进度:" + percent + "%");
        });
    }
}

步骤2:Python端接收回调并传递进度

在Python下载脚本中,接收Java回调对象,在下载过程中计算进度并调用Java的回调方法:

import requests
import time

def start_download(callback):
    # 替换为你的下载链接
    download_url = "https://example.com/large-file.zip"
    save_path = "/sdcard/downloaded_file.zip"  # 注意Android存储权限

    with requests.get(download_url, stream=True) as response:
        response.raise_for_status()
        total_size = int(response.headers.get("content-length", 0))
        downloaded = 0

        with open(save_path, "wb") as f:
            for chunk in response.iter_content(chunk_size=1024*1024):
                if chunk:
                    f.write(chunk)
                    downloaded += len(chunk)
                    if total_size > 0:
                        progress_percent = int((downloaded / total_size) * 100)
                        # 调用Java回调方法传递进度
                        callback.onProgressUpdate(progress_percent)
                        # 控制每秒返回一次进度
                        time.sleep(1)

注意事项

  • 权限配置:在AndroidManifest.xml中添加必要权限:
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    
  • 线程处理:Python下载操作可能在后台线程执行,Java端必须通过runOnUiThread切换到主线程更新UI,否则会抛出异常。
  • Chaquopy配置:确保你的项目已正确配置Chaquopy依赖(在build.gradle中添加相关配置)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 02:31:09