2017-01-13 2 views
2

In meiner App erstellen wir einen Thread zum Drucken über den Bluetooth-Drucker. Es funktioniert gut im Debug-Modus, aber Release-Modus gibt es ANR-Fehler. Ich beginne den Thread von einem Dienst. Ich verwende den folgenden Code ein:Thread friert die Benutzeroberfläche nur im Freigabemodus in Android

@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(); 
    } 

In Lollipop Version es gut funktioniert es nur geben Problem in Marsh Version, die auch im Release-Modus.

+1

Warum nicht einfach HandlerThread verwenden anstatt einen instabilen Mechanismus wie diesen zu implementieren? – Kelevandos

Antwort

0

Ich gehe davon aus, dass Ihr Code-Schnipsel in einer Klasse, die Thread

.start() erweitert sicherlich von Haupt-Thread in Ihrem Code aufgerufen wird. Es ist also keine gute Idee, hier eine Blockierung zu machen (while(...);).

Sie müssen eine nicht blockierende Wartezeit (Rückruf, Ereignis, Signal, ...) verwenden, um Informationen über Ihre Looper zu erhalten. (zB: EventBus, RxJava)

Sie können HandlerThread auch verwenden (wie @ Kelevandos im Kommentar sagen). Sie können in source code sehen, dass es genau das tut, was Sie wollen.

Wenn Sie uns mehr Code und Ihr Ziel geben, können wir Ihnen mehr helfen.

Verwandte Themen