2013-03-25 67 views
0

我有調用連接到IRC服務器的新線程的代碼。線程有循環來偵聽來自IRC服務器的響應,並調用一個方法'ProcessData'來響應。使用處理程序向正在運行的線程發佈消息

在我的用戶界面上,我希望能夠'退出'在onStop和onPause的IRC服務器。我遇到的麻煩是,當我使用Handler向IRC線程發送消息並向IRC服務器發送QUIT命令時,它告訴我正在UI線程上執行網絡操作。

的處理程序是建立在我的IRCManager類(此類擴展線程,而我在一個單獨的線程運行的類。

public Handler networkHandler = new Handler() { 

    @Override 
    public void handleMessage(Message msg) { 

     try { 
      processData((String) msg.obj); 
     } catch (IOException e) { 
      Log.e(TAG, "network handler given an object NOT of type String"); 
     } 
     super.handleMessage(msg); 
    } 

}; 

我用的是處理器從主活動,剛開始後對其進行實例化網線

irc.start(); 
networkHandler = irc.networkHandler; 

在活動的onPause我將消息發送給處理器

Message msg = new Message(); 
msg.obj = IRCManager.QUIT; 
networkHandler.sendMessage(msg); 

編輯:這裏是過程數據的方法

void processData(String data) throws IOException { 

    if (data.contains("PING")) { 
     String pingId = data.substring(6, data.length()); 
     sendMessage(pong + pingId + "\n"); 
     isConnected = true; 

     Message msg = new Message(); 
     msg.what = 1; 
     msg.obj = "test"; 
     handler.sendMessage(msg); 

    } else if (data.contains("Welcome")) { 
     sendMessage("PRIVMSG " + BOT_NAME + " JOIN " + siteId + "\n"); 

    } else if (data.contains(IRCManager.QUIT)) { 
     disconnect(); 

    } else if (isClientConnected()) { 
     Message msg = new Message(); 
     msg.what = 2; 
     msg.obj = "test"; 
     handler.sendMessage(msg); 
    } 
} 

似乎處理程序未正確連接到線程。任何人都可以闡明我如何做到這一點?

我的線程實際上花費99%的時間在while循環中檢查來自IRC服務器的輸入流。這也可能與它有關。

+0

你可以發佈processData方法嗎? – 2013-03-25 14:11:26

+0

您好,我已更新原始帖子 – Stephen 2013-03-25 14:17:49

+0

sendMessage()是否進行網絡調用? – 2013-03-25 14:18:40

回答

2

你正在創建的HandlernetworkHandler實例,在這裏:

public Handler networkHandler = new Handler() { 

它會與UI線程因此相關。

而且,當你說:

我使用的主要活動中的處理器和剛剛開始網線

irc.start(); 
networkHandler = irc.networkHandler; 

你沒有創建的實例後對其進行實例化那裏有Handler;你只是抓住了一個參考。

實際上,您需要在非UI Threadrun()方法中創建Handler的實例。

+0

就是這樣。非常感謝您的回答 – Stephen 2013-03-25 14:39:17

1

嘗試使用另一個構造與new Handler(new Handler.Callback())

+0

感謝您的建議。不幸的是它沒有工作 – Stephen 2013-03-25 14:20:45

相關問題