2017-01-13 35 views
2

在我的應用程序,我們正在創建一個線程通過藍牙打印機打印。它在調試模式下工作正常,但是釋放模式會導致ANR錯誤。我從服務啓動線程。我使用下面的代碼:線程凍結UI僅在發佈模式下的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(); 
    } 

在棒棒糖版本,它工作正常但只給出問題MARSHMELLOW版本也以發佈模式。

+1

爲什麼不使用HandlerThread而不是實現像這樣的不穩定機制? – Kelevandos

回答

0

我假設你的片段是在一個類擴展Thread

.start()肯定是在你的代碼的主線程調用。所以,在這裏阻止等待(while(...);)並不是一個好主意。

您必須使用非阻塞等待(回叫,事件,信號...)來獲取有關您的Looper的信息。 (例如:EventBus,RxJava

您也可以使用HandlerThread(例如@Kelevandos在評論中說)。你可以在source code中看到它正是你想要的。

如果你給我們更多的代碼和你的目標,我們可以幫助你更多。