2016-02-04 74 views
1

我試圖從pubnub得到服務器的時間與時間的方法異步Pubnub調用阻止Android的UI線程

mPubnub.time(callback); 

我想這是一個異步調用,然後我有一個等待循環剛過,所以我可以等待對於結果

time = -1; 
mPubnub.time(callback); 
while(time == -1); 

在回電我

Callback callback = new Callback() { 
    public void successCallback(String channel, Object response) { 
     try { 
      JSONArray jsonArray = new JSONArray(response.toString()); 
      time = jsonArray.getLong(0)/10000; 
      return; 
     } catch (JSONException e) { 
      e.printStackTrace(); 
     } 
     time = 0; 
    } 

    public void errorCallback(String channel, PubnubError error) { 
     Log.wtf("error/" + channel, error.toString()); 
     time = 0; 
    } 
}; 

所有這些電話來自AsyncTaskdoInBackground。它爲什麼阻止我的UI線程。還要求發佈也擋住了我的UI線程,我只能從AsyncTask

很多人打電話給他們說while循環阻塞UI線程,但我不明白,爲什麼在那的AsyncTask循環會阻止用戶界面線程。它不在onPostExecuteonProgressExecute中。它在doInBackground,它不應該阻止用戶界面。

在另一方面去除環路仍然塊UI線程

mPubnub.time(callback); 
mPubnub.publish(channel, message, true, callback); 

這些簡單的呼叫阻塞UI線程和所述應用程序停止響應。

回答

2

這是阻止您的UI線程:

while(time == -1); 

而是這樣做的,你應該通過回調處理成功/失敗。如果pubnub API像這樣進行回調,那麼它看起來好像它已經在後臺線程上處理它一樣。只需在回調處理程序中採取適當的操作即可。

+0

即使我這樣做,一個簡單的發佈是阻止ui線程。我實際上處理以下回調,但我想了解爲什麼後臺任務阻止UI線程 – user2798694

+0

如果您正在這樣做一個while循環,則會阻塞該線程。 –

+1

while(時間== -1)如上所述阻止你的線程。把日誌消息放在那裏,你會看到。 –

0

while(time == -1);

這條線阻擋了您的UI線程,因爲這個指針永遠不會被其他線程更新,它不是一個volatile變量。 您可以使用Debug Bottle來檢測項目中的UI塊代碼。