2017-01-13 3 views
2

Dans mon application, nous créons un thread pour l'impression via l'imprimante Bluetooth. il fonctionne bien en mode debug mais le mode de release donne une erreur ANR. Je commence le fil d'un service. Je suis en utilisant le code suivant:Thread gèle l'interface utilisateur uniquement en mode de diffusion dans anroid

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

Dans la version lollipop il fonctionne très bien, il ne se donne problème dans la version Marshmellow que trop en mode libération.

+1

Pourquoi ne pas simplement utiliser HandlerThread au lieu d'implémenter un mécanisme instable comme celui-ci? – Kelevandos

Répondre

0

Je suppose que votre extrait est dans une classe qui s'étendent Thread

.start() est certainement appelé thread principal de votre code. Donc, ce n'est pas une bonne idée de faire une attente de blocage ici (while(...);).

Vous devez utiliser une attente non bloquante (rappel, événement, signal, ...) pour obtenir des informations sur votre Looper. (Par exemple: EventBus, RxJava)

Vous pouvez aussi utiliser HandlerThread (comme @Kelevandos dire dans le commentaire). Vous pouvez voir dans source code qu'il fait exactement ce que vous voulez.

Si vous nous donnez plus de code et votre objectif, nous pouvons vous aider davantage.