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

Android加载大量图片时Kivy进程被杀死问题求助

环境信息

  • kivy: 2.2.1
  • kivymd 1.2.0dev0
  • python3
  • android 10 api 29
  • androidstorage4kivy 0.0.0

需求

从Android文档存储中导入100张图片到Kivy应用,并实现快速展示(耗时少于3秒)

已完成操作

已通过androidstorage4kivy实现从共享存储到应用私有存储的图片导入。在on_start方法中创建X个Tile以加载X张JPG图片,X为可通过TextField修改的数值(用于隔离内存问题)

遇到的问题

  • 加载少于20张图片时正常;
  • 加载20-30张图片时,应用恢复(resume)时图片会缓慢重新加载;
  • 加载31张及以上图片时,出现疑似内存问题:加载过程中出现黑屏,推测Android杀死了应用进程,Logcat中出现以下日志:
    • E InputDispatcher: channel : Channel is unrecoverably broken and will be disposed!
    • Process 7798 exited due to signal 9 (Killed)

代码片段

完整代码共240行,以下为关键片段:

class MyMDSmartTile(MDSmartTile):
    index_picture = StringProperty()

    def on_kv_post(self, widget):
        if exists(join("images", self.index_picture + ".jpg")) :
            self.source = join("images", self.index_picture + ".jpg") 
        else:
            self.source = join("images","default.png")

class ErrorBlackScreen(MDApp):
    def build(self):
        # instanciate Tiles : 
        return Builder.load_string(KV)
    def on_start(self):
        for i in range(total): # total is a user input
            self.root.ids.grid.add_widget(MyMDSmartTile(index_picture = str(i+1)))

方案分析与建议

针对你列出的方向逐一分析:

  1. 减小图片体积:完全可行,这是最直接有效的手段。Android对单应用内存限制严格,原图体积过大(比如单张几MB)会快速耗尽内存。可以在导入时对图片进行压缩,比如调整分辨率(适配应用展示的实际尺寸,不用保留原图分辨率)、降低JPG质量(比如80%质量,肉眼差异不大但体积大幅减小)。
  2. Kivy Loader异步加载:可行。当前同步加载会阻塞主线程,导致ANR甚至被系统杀死。改用异步加载可以分散内存占用峰值,同时避免UI卡顿。可以用Loader类的异步加载方法,在图片加载完成后再设置给Tile的source,避免一次性加载所有图片。
  3. 不在kv_post时加载图片:可行。kv_post是组件初始化阶段调用的,此时批量加载会导致短时间内内存暴涨。可以改为按需加载,比如只有当Tile滚动到可视区域时再加载图片,或者在应用启动后分批次加载(比如每次加载10张,间隔几百毫秒)。
  4. 研究atlas特性:可行。Kivy的atlas可以将多张图片打包成一个纹理集,减少纹理切换开销,同时优化内存占用(避免多个小纹理的内存碎片),适合批量展示的图片场景,尤其是尺寸统一的图片。
  5. Cython性能优化:优先级较低。当前问题核心是内存占用过高而非Python代码执行效率,Cython优化对内存问题帮助不大,建议先解决内存问题后再考虑。

额外建议:

  • 检查内存泄漏:确保不再使用的图片能被GC回收,比如移除Tile时及时清理相关纹理引用;
  • 改用RecyclerView:替代普通GridLayout,它会复用组件,不会一次性创建所有Tile,大幅减少内存占用,同时支持按需加载图片,特别适合大量图片展示场景;
  • 监控内存使用:用Android Studio的Profiler查看应用内存变化,定位内存占用峰值的来源,确认是图片纹理占用还是其他问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 00:38:37