2017-01-13 3 views
2

В моем приложении мы создаем поток для печати через принтер Bluetooth. он отлично работает в режиме отладки, но в режиме выпуска он дает ошибку ANR. Я начинаю поток из службы. Я использую следующий код:Нить замораживает пользовательский интерфейс только в режиме деблокирования в андроиде

@Override 
    public void start() { 
     super.start(); 
     while (!threadInitOK); // it is getting stuck here 
    } 

    @Override 
    public void run() { 
     Looper.prepare(); 
     mLooper = Looper.myLooper(); 

     if (null == mLooper) 
      Log.v(TAG, "mLooper is null pointer"); 
     else 
      Log.v(TAG, "mLooper is valid"); 
     workHandler = new WorkHandler(); 
     threadInitOK = true; 
     Looper.loop(); 
    } 

В версии леденца она работает нормально она только дает вопрос в Marshmellow версию, которая тоже в освобождении режиме.

+1

Почему бы не использовать HandlerThread вместо реализации нестабильного механизма, подобного этому? – Kelevandos

ответ

0

Я предполагаю, что ваш фрагмент кода находится в классе, которые проходят Thread

.start() конечно вызывается из главного потока в вашем коде. Итак, не стоит здесь останавливать блокировку (while(...);).

Чтобы получить информацию о вашем Looper, вы должны использовать неблокирующий (обратный вызов, событие, сигнал, ...). (например: EventBus, RxJava)

Вы также можете использовать HandlerThread (например, @Kelevandos сказать в комментарии). Вы можете видеть в source code, что он делает именно то, что вы хотите.

Если вы дадите нам больше кода и свою цель, мы сможем вам помочь.

Смежные вопросы