2012-06-19 102 views
3

我有一個服務正在從服務器提取數據。我有活動作爲gui需要更新。從服務發送消息到UI線程 - 在服務處理程序中延遲的消息

因此,在不同的場合,例如信息已成功從服務器中提取出來,服務器必須通知有新信息的活動。

爲此,我實現了這個功能:

/** 
* ServerService.class 
* 
* Sends a message to the observer that there is a new status message to be 
* pulled from the service# 
* 
* @param pMessage 
*   the message to be set to the public status 
*/ 
private void signalNewStatus(String pMessage) { 

    //check if there is a message at all to be signaled as new 
    if (pMessage != null) { 
     Log.v(tag, "signalNewStatus:" + pMessage); 

     // set the message 
     vStatus = pMessage; 

     // start the new callback via the handler 
     myMessageHandler.sendEmptyMessage(I_STATUS_UPDATE_SIGNAL); 
    } 
} 

要處理的消息,我的消息處理程序:

private final Handler myMessageHandler = new Handler() { 
    @Override 
    public void handleMessage(Message msg) { 
     Log.i(tag, "handleMessage: "+msg.what); 

     switch (msg.what) { 

     case I_STATUS_UPDATE_SIGNAL: { 

      // Broadcast to all clients the new value. 
      final int N = myCallbackList.beginBroadcast(); 

      for (int i = 0; i < N; i++) { 
       try { 
        myCallbackList.getBroadcastItem(i).sendUpdateStatusSignal(true); 

       } catch (RemoteException e) { 

       } 
      } 
      myCallbackList.finishBroadcast(); 
     } 
      break; 

第一個函數被調用很多時候,我可以在看記錄這項工作正確無誤。

但是,消息處理的日誌記錄不會馬上被調用。它最終會延遲並最常被調用。以某種方式作爲批量。

我不明白爲什麼會出現這種情況。其餘的工作正常,一旦消息被處理,消息就會到達UI線程而沒有問題。

有什麼建議嗎?

非常感謝!

+0

想想消息碰撞。可能會有其他人發送很多消息並阻止/創建此消息的延遲。 –

+0

不,這不是消息接收者(UI Thread)的問題,問題發生在服務端。只有服務可以從其內部發送消息。 – user929995

回答

0

我不能確定沒有更多的代碼,但它聽起來像是一個線程問題。

嘗試將您的處理程序代碼放入單獨的HandlerThread中,檢索服務中的處理程序並將消息發送給它。