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

7 回复

开发者您好,注册打印任务被取消的监听,异步回调函数中,会通知调用方打印任务被取消。具体可参考官网文档: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 | 因取消导致的打印任务预览能力销毁。 |

https://developer.huawei.com/consumer/cn/doc/harmonyos-references/capi-ohprint-h#print_jobdocadapterstate

开发者您好,针对监听打印预览界面被关闭能力需求,您方便的话,麻烦您补充提供一下以下信息:

请问您是在什么样的业务场景中使用该能力,交互流程是怎样的,在打印预览界面被关闭时无法监听?方便说明能力不满足可能带来的影响:什么时间用到?是否高频?有无三方库可以做到?若提供该能力,是否会造成大工作量返工?请您注意提供的内容不要包含您或第三方的非公开信息,如给您带来不便,敬请谅解。

感觉是个很正常的交互场景吧:

【问题背景】

我们需要提供一个打印接口出去,该接口可以调用系统打印能力实现打印(图片、文档)功能,同时返回打印结果;

【问题现象】

在调用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对象来管理。你可以通过PrintTaskon('stateChange')方法监听打印任务的状态变化,例如任务开始、完成或失败。但直接关闭打印页面本身不会触发特定的回调事件。

在HarmonyOS Next中,当用户通过点击打印界面的X按钮直接关闭窗口时,系统会触发printTask'cancel'事件。根据你提供的代码,'cancel'事件的监听器已经正确配置,理论上应该能正常捕获该事件并执行回调。

关于事件监听器的释放问题,print.PrintTask对象在打印任务完成后(无论是成功、失败还是取消)会自动释放其内部资源,包括已注册的事件监听器。这意味着你通常不需要手动调用off方法来移除监听,系统会自动管理其生命周期,不会造成内存泄漏。

然而,如果你希望在特定时机主动移除监听(例如在组件销毁时),可以保存printTask的引用,并在适当的时候调用printTask.off('cancel', callback)等方法。但根据当前API设计,这不是必须操作。

建议检查日志输出,确认'cancel'事件的回调是否被执行。如果仍未触发,可能是打印服务在特定场景下的行为差异,可尝试在printTask上增加'complete'事件监听作为兜底处理,该事件在任务结束时(无论结果)都会触发。

回到顶部