繁体   English   中英

另一个线程的监听器

[英]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 您能帮忙指出问题吗?

解决这个问题的方法有多种,以下是两种:

  1. 在活动中使用处理程序。 例如,当您从后台线程收到通知,需要播放视频时,您会向“活动”的处理程序发送一条消息。 自定义处理程序中的代码可以在UI线程上运行。 这是一个教程(来自很多) http://www.helloandroid.com/taxonomy/term/43

  2. 当后台线程获取数据包时,广播一个Intent(上下文类上的startBroadcast())。 在您的活动中为此广播注册一个接收器。

通常的方法是让使用者线程(这里是您的主线程)等待信号量或锁定,而生产者线程(这里是服务器线程)在资源可用时(即,当已收到来自客户端的输入)。

看一下java.util.concurrentjava.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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM