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秒后再次尝试,最多重试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
- 修改截图步骤(A3):
用临时文件替换原文件,减少占用时间
截图先保存到临时文件,再原子替换目标文件,避免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端优化
实现带重试的安全文件读写函数
替换直接打开文件的代码,用循环尝试访问,直到成功或达到重试上限,避免因文件占用直接崩溃: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)及时释放文件句柄
用try-finally包裹图片处理逻辑,确保分析完成后立即关闭图片对象,释放文件锁,减少Tasker访问时的冲突概率。
内容的提问来源于stack exchange,提问作者alwaysintrouble
相关产品推荐
相关产品推荐

