2014-10-08 123 views
0

當我嘗試打印到藍牙打印機時,出現主線程上的很多活動錯誤。我試圖改變它使用一個線程,但然後我的AlterDialog不起作用。 是否有另一種方法可以使其顯示AlterDialog? 謝謝。AlertDialog無法在線程中運行Android

public class PrinterFunctions{ 

private static void sendCommand(final Context context,final String portName, final String portSettings, final ArrayList<Byte> byteList) { 

    new Thread() { 
     @Override 
     public void run() { 
      StarIOPort port = null; 

      try { 

       port = StarIOPort.getPort(portName, portSettings, 10000, context); 

       try { 
        Thread.sleep(100); 
       } catch (InterruptedException e) { 
       } 


       StarPrinterStatus status = port.beginCheckedBlock(); 

       if (true == status.offline) { 
        throw new StarIOPortException("A printer is offline"); 
       } 

       byte[] commandToSendToPrinter = convertFromListByteArrayTobyteArray(byteList); 
       port.writePort(commandToSendToPrinter, 0, 
         commandToSendToPrinter.length); 

       port.setEndCheckedBlockTimeoutMillis(30000); 
       status = port.endCheckedBlock(); 

       if (true == status.coverOpen) { 
        throw new StarIOPortException("Printer cover is open"); 
       } else if (true == status.receiptPaperEmpty) { 
        throw new StarIOPortException("Receipt paper is empty"); 
       } else if (true == status.offline) { 
        throw new StarIOPortException("Printer is offline"); 
       } 
      } catch (StarIOPortException e) { 
       Builder dialog = new AlertDialog.Builder(context); 
       dialog.setNegativeButton("Ok", null); 
       AlertDialog alert = dialog.create(); 
       alert.setTitle("Failure"); 
       alert.setMessage(e.getMessage()); 
       alert.setCancelable(false); 
       alert.show(); 
      } finally { 
       if (port != null) { 
        try { 
         StarIOPort.releasePort(port); 
        } catch (StarIOPortException e) { 
        } 
       } 
      } 
     } 
    } 
    }.start(); 

} 
} 

回答

0

當你想更新其他線程(不是主線程)的用戶界面,您必須使用Handler

private Handler handler=new Handler(); 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    new Thread() { 
     @Override 
     public void run() { 
      handler.post(new Runnable() { 
       @Override 
       public void run() { 
        Builder dialog = new AlertDialog.Builder(context); 
        dialog.setNegativeButton("Ok", null); 
        AlertDialog alert = dialog.create(); 
        alert.setTitle("Failure"); 
        alert.setMessage(e.getMessage()); 
        alert.setCancelable(false); 
        alert.show(); 
       } 
      }); 
     }; 
    }.start(); 
} 
+0

我會添加這個een catch(StarIOPortException e){最後在我上面的代碼中? – 2014-10-14 21:15:22

+0

以上是不能正常工作的應用程序崩潰。 – 2014-10-23 21:04:31

0

嘗試在例外捕手使用下面的代碼:

((Activity) context).runOnUiThread(new Runnable() { 
      @Override 
      public void run() { 
       Builder dialog = new AlertDialog.Builder(context); 
       dialog.setNegativeButton("Ok", null); 
       AlertDialog alert = dialog.create(); 
       alert.setTitle("Failure"); 
       alert.setMessage(e.getMessage()); 
       alert.setCancelable(false); 
       alert.show(); 
      } 
     }); 

final Handler handler = new Handler(); 
     new Thread() { 
      @Override 
      public void run() { 
       handler.post(new Runnable() { 
        @Override 
        public void run() { 
         Builder dialog = new AlertDialog.Builder(context); 
         dialog.setNegativeButton("Ok", null); 
         AlertDialog alert = dialog.create(); 
         alert.setTitle("Failure"); 
         alert.setMessage(e.getMessage()); 
         alert.setCancelable(false); 
         alert.show(); 
        } 
       }); 
      }; 
     }.start(); 
+0

我將爲現有線程內的警報對話框創建一個新線程? – 2014-10-14 21:12:17

+0

以上都不是應用程序崩潰。 – 2014-10-23 21:04:54