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

Tasker与Pydroid文件共享冲突致崩溃,如何检测文件占用并等待?

解决Tasker与Pydroid文件访问冲突导致崩溃的问题

问题背景

用Tasker和Pydroid开发手机图像识别应用:Tasker每5秒截取屏幕保存,同时读取结果文件展示最新分析结果;Pydroid打开截图分析后,将结果写入文本文件供Tasker读取。但当其中一个应用占用文件时,另一个应用尝试访问会导致手机崩溃重启,需要在两端实现文件占用检测与等待机制。

当前Tasker任务代码

A1: Flash [
         Text: Enabled
         Continue Task Immediately: On
         Dismiss On Click: On ]
    
    A2: Variable Set [
         Name: %Enabled
         To: True
         Max Rounding Digits: 3
         Structure Output (JSON, etc): On ]
    
    A3: Take Screenshot [
         File: /storage/47BE-16F5/folder/screenshot.png ]
    
    A4: Read File [
         File: /storage/47BE-16F5/folder/text.txt
         To Var: %text
         Structure Output (JSON, etc): On ]
    
    A5: Flash [
         Text: %text
         Continue Task Immediately: On
         Dismiss On Click: On ]
    
    A6: Wait [
         MS: 0
         Seconds: 5
         Minutes: 0
         Hours: 0
         Days: 0 ]
    
    A7: Goto [
         Type: Action Number
         Number: 3 ]
        If [ %Enabled eq True ]

当前Python代码

from PIL import Image

screenshot = Image.open("/storage/47BE-16F5/folder/screenshot.png")
...
with open(TEXT_DIR, 'w', encoding="utf-8") as f:
    f.write(results)

解决方案

Tasker端优化

  1. 给文件操作添加重试机制
    在截图和读文件操作前加入循环重试,遇到错误时等待1秒后再次尝试,最多重试3次:

    • 修改截图步骤(A3):
      A3: For [ Variable: %retry Items: 1,2,3 ]
          A3.1: Take Screenshot [ File: /storage/47BE-16F5/folder/screenshot.png ]
          A3.2: If [ %err Set ]
              A3.3: Wait [ Seconds: 1 ]
              A3.4: Continue Loop
          A3.5: Else
              A3.6: Break Loop
          A3.7: End If
      
    • 修改读文件步骤(A4):
      A4: For [ Variable: %retry Items: 1,2,3 ]
          A4.1: Read File [ File: /storage/47BE-16F5/folder/text.txt To Var: %text ]
          A4.2: If [ %err Set ]
              A4.3: Wait [ Seconds: 1 ]
              A4.4: Continue Loop
          A4.5: Else
              A4.6: Break Loop
          A4.7: End If
      
  2. 用临时文件替换原文件,减少占用时间
    截图先保存到临时文件,再原子替换目标文件,避免Pydroid读取到半写入的截图:

    A3: Take Screenshot [ File: /storage/47BE-16F5/folder/screenshot_temp.png ]
    A3.1: Move/Copy File [ From: /storage/47BE-16F5/folder/screenshot_temp.png To: /storage/47BE-16F5/folder/screenshot.png Replace: On ]
    

Pydroid端优化

  1. 实现带重试的安全文件读写函数
    替换直接打开文件的代码,用循环尝试访问,直到成功或达到重试上限,避免因文件占用直接崩溃:

    import time
    from PIL import Image
    
    def safe_open_image(file_path, max_retries=5, delay=1):
        for _ in range(max_retries):
            try:
                # 以只读模式打开,降低锁冲突概率
                return Image.open(file_path, mode='r')
            except Exception:
                time.sleep(delay)
        raise RuntimeError(f"无法打开截图文件,重试{max_retries}次后失败")
    
    # 安全打开截图
    screenshot = safe_open_image("/storage/47BE-16F5/folder/screenshot.png")
    try:
        # 图像分析逻辑...
        results = "分析结果"
    finally:
        # 确保图片对象关闭,释放文件句柄
        screenshot.close()
    
    def safe_write_file(file_path, content, max_retries=5, delay=1):
        for _ in range(max_retries):
            try:
                with open(file_path, 'w', encoding="utf-8") as f:
                    f.write(content)
                return
            except Exception:
                time.sleep(delay)
        raise RuntimeError(f"无法写入结果文件,重试{max_retries}次后失败")
    
    # 安全写入分析结果
    safe_write_file(TEXT_DIR, results)
    
  2. 及时释放文件句柄
    用try-finally包裹图片处理逻辑,确保分析完成后立即关闭图片对象,释放文件锁,减少Tasker访问时的冲突概率。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 14:55:22