我一直在做一个通过蓝牙打印机打印给定文档的功能。过了一段时间,客户端希望打印每个文档的多份副本,为此,我修改了我现有的代码。
> var count = 5
> for ((key, value) in printHashMap) {
> if (key == "BILL_PRINT"){
>
> if (type == "0") {
>
>
> for(i in 1 until count) {
>
> var dialog = SweetAlertDialog(context, SweetAlertDialog.BUTTON_CONFIRM)
> dialog.setTitleText("Printing Copy ($i)")
> .showCancelButton(false)
> .setCancelText("No")
> .setCancelClickListener { sDialog ->
> sDialog.dismiss()
> //need to break the loop exit to the outer For-Loop
>
> }
> .setConfirmText("Yes")
> .setConfirmClickListener { sDialog ->
> sDialog.dismissWithAnimation()
>
> ioScope.launch {
> runBlocking {
>
> if (printingDone(value)) {
>
> Log.d("Printer", "Printer Done")
>
>
> }else{
> Log.d("Printer", "Printer Error")
> //need to break the loop exit to the outer For-Loop
> }
> }
> }
>
> prograssDialog.dismissWithAnimation()
>
> }
> .show()
>
> }
>
>
>
>
> }
>
> }
> }因此,根据代码,我想暂停这个过程以便用户确认,如果用户说‘是’,那么打印机应该开始打印文档的副本。如果用户说“不”,那么循环就会出现,并继续使用外部For-循环。当我运行这个函数时,我在Logcat上得到以下消息:
跳过255帧!应用程序可能在其主线程上做了太多的工作。
我甚至尝试过While循环阻塞和线程处理,但它们中的任何一种似乎都不像预期的那样起作用。实现这种用例的正确方法是什么?任何形式的指导都将不胜感激。
发布于 2019-09-02 15:25:46
基本上,不要阻止UI线程。您可以做的就是在后台打印内容(我个人喜欢使用anko的doAsync,在需要时在UI线程(与runOnUiThread)上弹出一个对话框。
这样你就不会阻塞用户界面,系统也不会抱怨
编辑:,我也使用回调函数来识别打印任务是否完成。
https://stackoverflow.com/questions/57758684
复制相似问题