[英]Listener for another thread
我有一个具有GUI和TCP服务器的应用程序。 TCP服务器在另一个线程中运行,并且在收到某个数据包时,它应该开始播放视频文件(来自MediaPlayer对象)。 问题是,作为GUI组件,仅当从主线程调用视频时,才可以显示视频。 我在主类中添加了一个侦听器类:
Class RequestListener implements NBRequestListener{ /* NBRequestListener is the interface */
public void onRequestArrived(String request) {
processRequest(request); /* This method will run the video */
}
我在主线程中创建了一个侦听器,并将其设置为服务器中的侦听器:
RequestListener listener = new RequestListener();
server.setRequestListener(listener);
服务器中的代码是:
public void setRequestListener(_listener) {
listener = _listener; } /* listener is defined as RequestListener */
而事件的调用(在服务器中)很简单:
listener.onRequestArrived(input_from_client);
但是侦听器方法是在服务器线程中而不是在主线程中调用的,因此我得到了异常: java.lang.reflect.InvocationTargetException
。 您能帮忙指出问题吗?
解决这个问题的方法有多种,以下是两种:
在活动中使用处理程序。 例如,当您从后台线程收到通知,需要播放视频时,您会向“活动”的处理程序发送一条消息。 自定义处理程序中的代码可以在UI线程上运行。 这是一个教程(来自很多) http://www.helloandroid.com/taxonomy/term/43
当后台线程获取数据包时,广播一个Intent(上下文类上的startBroadcast())。 在您的活动中为此广播注册一个接收器。
通常的方法是让使用者线程(这里是您的主线程)等待信号量或锁定,而生产者线程(这里是服务器线程)在资源可用时(即,当已收到来自客户端的输入)。
看一下java.util.concurrent
和java.util.concurrent.locks
包中的Lock和Semaphore。
许多UI只需一个线程(“事件”线程)即可对UI状态执行操作。 这是为了防止并发和一致性问题。
当您从另一个线程调用方法时,您会违反此规则。 通常,一个好的解决方案是将一个事件添加到事件队列中,该事件将在事件线程的上下文中执行。
在秋千上是这样的:
SwingUtilities.invokeLater(new Runnable(){
public void run(){
//Your UI code to be run in the context of the event thread.
//In your case linking the video.
}
});
如您所说,您不应阻止UI线程,否则它将阻止它。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.