如何将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
相关产品推荐
相关产品推荐

