2013-03-25 19 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

相关问题