2017-01-13 6 views
2

私のアプリでは、Bluetoothプリンタで印刷するためのスレッドを作成しています。デバッグモードでは正常に動作していますが、リリースモードではANRエラーが発生しています。私はサービスからスレッドを開始しています。私は次のコードを使用しています:スレッドではUIがフリーズモードでのみフリーズしています

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

ロリポップバージョンでは、それはあまりにもリリースモードでもマシュマロバージョンで問題を提起しています。

+1

なぜこのような不安定なメカニズムを実装するのではなく、HandlerThreadを使用するだけですか? – Kelevandos

答えて

0

私はあなたのスニペットはThread

.start()を拡張するクラスであることを前提とは確かにあなたのコード内のメインスレッドから呼び出されます。したがって、ここでブロッキングを待つことをお勧めしません(while(...);)。

Looperに関する情報を取得するには、非ブロッキング待機(コールバック、イベント、信号など)を使用する必要があります。 (例:EventBusRxJava

HandlerThreadも使用できます(@Kelevandosのコメントのように)。 source codeに、あなたが望むものを正確に見ることができます。

もっとコードと目標を教えていただければ、より多くのお手伝いをすることができます。

関連する問題