HarmonyOS鸿蒙Next中使用print.Print拉起打印页面后,直接关闭有事件回调吗?
HarmonyOS鸿蒙Next中使用print.Print拉起打印页面后,直接关闭有事件回调吗? 类似【扫码界面如何监听无操作返回事件】这篇文章,打印任务拉起后,直接关闭。并没有产生任何回调,printTask做出的监听怎么off掉呢,会产生泄露吗?
下面代码可以拉起打印页面,同时监听都已配置号,但是直接点击X号关闭打印窗口。没有产生任何回调,也找不到off的时机。
// 调用系统打印接口,并传入以上三个参数。
print.print([fileUri.getUriFromPath(result.fileSrc)], AnydoorInfoInternal.getInstance().context).then((printTask: print.PrintTask) => {
printTask.on('succeed', () => {
Logger.info('print state is succeed');
params?.callback?.onSuccess();
});
printTask.on('cancel', () => {
Logger.info(`result ==> 取消打印`);
params?.callback?.onFail();
});
printTask.on('fail', () => {
Logger.info(`result ==> 调用打印服务失败`);
params?.callback?.onFail();
});
}).catch((err: BusinessError) => {
Logger.errorInfo('print err ' + JSON.stringify(err));
params?.callback?.onFail();
});
更多关于HarmonyOS鸿蒙Next中使用print.Print拉起打印页面后,直接关闭有事件回调吗?的实战教程也可以访问 https://www.itying.com/category-93-b0.html
开发者您好,注册打印任务被取消的监听,异步回调函数中,会通知调用方打印任务被取消。具体可参考官网文档:on。注册off监听取消,在then的回调中进行监听,具体示例可参考官网文档:off示例。
如果未能解决您的问题,请您再反馈。
更多关于HarmonyOS鸿蒙Next中使用print.Print拉起打印页面后,直接关闭有事件回调吗?的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
我想监听的不是打印任务被取消,而是打印预览界面被关闭。也就是没有开始打印前就取消。
即这个状态:
| PRINT_DOC_ADAPTER_PREVIEW_ABILITY_DESTROY_FOR_CANCELED = 5 | 因取消导致的打印任务预览能力销毁。 |
开发者您好,针对监听打印预览界面被关闭能力需求,您方便的话,麻烦您补充提供一下以下信息:
请问您是在什么样的业务场景中使用该能力,交互流程是怎样的,在打印预览界面被关闭时无法监听?方便说明能力不满足可能带来的影响:什么时间用到?是否高频?有无三方库可以做到?若提供该能力,是否会造成大工作量返工?请您注意提供的内容不要包含您或第三方的非公开信息,如给您带来不便,敬请谅解。
感觉是个很正常的交互场景吧:
【问题背景】
我们需要提供一个打印接口出去,该接口可以调用系统打印能力实现打印(图片、文档)功能,同时返回打印结果;
【问题现象】
在调用print.Print能力后,会拉起一个打印预览页面,如果这个预览页面直接被关闭,我们预期返回一个“打印取消”的结果,但是目前没法捕捉到这个用户操作的场景。
【问题影响】
在该操作路径下,接口无法正确识别并返回结果:“用户关闭预览界面”。
另外,当前发现使用下述方法,在printAdapter中的onJobStateChanged方法是可以监听到预览界面被关闭的操作的,但是该方法只支持pdf打印,如果打印的是其他资源如图片(png\jpg)或者文档(docx)都会出现预览界面一直是“正在加载”的现象。所以也无法满足当前打印诉求
function print(jobName: string, printAdapter: PrintDocumentAdapter, printAttributes: PrintAttributes, context: Context): Promise<PrintTask>;
onJobStateChanged(jobId: string, state: print.PrintDocumentAdapterState): void {
Logger.info(`jobId: ${jobId}, state: ${state}`);
}
看官网文档off示例,我理解就是在then的回调里面写吧,楼主试一下呢?
import { print } from '@kit.BasicServicesKit';
import { BusinessError } from '@kit.BasicServicesKit';
import { fileUri } from '@kit.CoreFileKit';
let filePath = '/data/storage/el2/base/haps/entry/files/test.pdf';
print.print([fileUri.getUriFromPath(filePath)]).then((printTask: print.PrintTask) => {
printTask.off('block', () => {
console.info('unregister state block');
})
// ...
}).catch((error: BusinessError) => {
console.error('print err ' + JSON.stringify(error));
})
在HarmonyOS Next中,使用print.Print拉起打印页面后,直接关闭时没有专门的事件回调。打印任务的状态主要通过PrintTask对象来管理。你可以通过PrintTask的on('stateChange')方法监听打印任务的状态变化,例如任务开始、完成或失败。但直接关闭打印页面本身不会触发特定的回调事件。
在HarmonyOS Next中,当用户通过点击打印界面的X按钮直接关闭窗口时,系统会触发printTask的'cancel'事件。根据你提供的代码,'cancel'事件的监听器已经正确配置,理论上应该能正常捕获该事件并执行回调。
关于事件监听器的释放问题,print.PrintTask对象在打印任务完成后(无论是成功、失败还是取消)会自动释放其内部资源,包括已注册的事件监听器。这意味着你通常不需要手动调用off方法来移除监听,系统会自动管理其生命周期,不会造成内存泄漏。
然而,如果你希望在特定时机主动移除监听(例如在组件销毁时),可以保存printTask的引用,并在适当的时候调用printTask.off('cancel', callback)等方法。但根据当前API设计,这不是必须操作。
建议检查日志输出,确认'cancel'事件的回调是否被执行。如果仍未触发,可能是打印服务在特定场景下的行为差异,可尝试在printTask上增加'complete'事件监听作为兜底处理,该事件在任务结束时(无论结果)都会触发。

