【问题标题】:How to stop the UI thread in my app until other thread completes printing如何在我的应用程序中停止 UI 线程,直到其他线程完成打印
【发布时间】:2016-02-09 19:24:23
【问题描述】:

说明:

  • 在我的应用程序中,我需要使用蓝牙打印机打印数据。
  • UI 线程必须等到另一个线程处理打印 完成任务
  • 打印线程设置一个值是否可以打印

问题:应用程序中的 UI 线程没有等待,它立即获得默认状态 false

我在下面的代码中哪里出错了?

界面线程:

private void printingStatus()
{
    if(printData.isPrintFinished())
        // do something
    else
        // do something
}

// 在不同线程中执行打印的 PrintData 类

    private boolean printFinished = false;
// UI thread asks this method whether printing is success or failure
public boolean isPrintFinished() {
    return printed;
}

public void setPrintFinished(boolean printed) {
    this.printed = printed;
}

public static interface IPrintFinished {
    public void onPrintFinished(boolean success);
}

public void printData() {
    sendDataToPrinter(context, contentToPrint, new IPrintFinished() {
        @Override
        public void setPrintFinished(boolean success) {
            if (success) {
                setPrintFinished(true);
                Logger.e("inside if success - printed"+printed);
            }
            setPrintFinished(false);
            Logger.e("printed outside if" + printed);
        }
    });
}
public static void sendDataToPrinter(final Context context, final contentDefinition contentToPrint, final IPrintFinished listener) {
    new Thread(new Runnable() {
    @Override
    public void run() {
        Looper.prepare();
        // starts here the actual printing and gets a result
        int tmpResult;
          try {
              DataPrinter.getInstance().print(contentToPrint);
              try {
                  Thread.sleep(2000);
              } catch (InterruptedException e) {
                  Logger.e("exceptpion:" + e);
              }
              tmpResult =  STATUS_PRINTED;
          } catch (TechnicalException e) {
              Logger.e("exceptpion:" + e);
              if (e.getMessage() != null && DataPrinter.ERROR_BLUETOOH_IS_DISABLED.equals(e.getMessage()))
                  tmpResult = STATUS_BLUETOOTH_DISABLED;
              else
                  tmpResult = STATUS_ERROR;
          }


          final int result = tmpResult;
          Logger.e("print result:"+result);
          new Handler(Looper.getMainLooper()).post(new Runnable() {

              @Override
              public void run() {

                  if(result == STATUS_PRINTED) {
                      if (listener != null) {
                          Logger.e("inside the listener status printed");
                          listener.onPrintFinished(true);
                      }
                  } else if (result == STATUS_BLUETOOTH_DISABLED) {
                      SimpleToast.showToast("bluetooth disabled");
                      if (listener != null) {
                          listener.onPrintFinished(false);
                      }
                  } else {
                      SimpleToast.showToast("cannot connect to printer");
                      if (listener != null) {
                          listener.onPrintFinished(false);
                      }
                  }
              }
          });

                Looper.loop();
            }
        }).start();
    }

【问题讨论】:

    标签: android multithreading printing bluetooth


    【解决方案1】:

    不能暂时保留您的 UI 线程。这将导致ANR 状态。它是处理 UI 组件的主线程。

    【讨论】:

    • 用户将打印屏幕上显示的内容。所以打印是从 UI 线程触发的。在代码中,一旦收到状态,则必须根据先前的打印状态向打印机发送另一组数据
    • @srinivasa 要执行网络任务,您应该使用单独的线程或 AsyncTask 并与 UI 线程通信以获得结果。
    • @srinivasa 如果你想阻止用户在打印完成时做任何事情,你应该使用一个阻塞的 UI 元素——比如一个进度对话框。它是模态的,需要焦点,用户在等待时将无法做任何事情。打印作业完成后,您可以关闭对话框。
    • 是的,你是对的。打印任务在单独的线程中完成。当用户点击打印时,必须打印两组数据。只有当第一组数据打印成功时,才会发送第二组数据。
    • 是的,实际上有一个进度对话框,我没有在这里添加。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-04
    • 1970-01-01
    • 2016-07-13
    • 1970-01-01
    • 1970-01-01
    • 2013-12-12
    相关资源
    最近更新 更多