【问题标题】:Android Application hanging on subscriber.recv()挂在subscriber.recv() 上的Android 应用程序
【发布时间】:2015-07-21 18:41:59
【问题描述】:

我正在编写一个接收连续数据流的 Android 应用程序。 我已经像这样在可运行文件中设置了连接:

Runnable runnable = new Runnable()
    {
        public void run()
        {
        ZMQ.Context context = ZMQ.context(1);
        ZMQ.Socket subscriber = context.socket(ZMQ.SUB);
        subscriber.connect("tcp://[IP]:[Port]");
            TextView strDisplay = (TextView) findViewById(R.id.stringDisplay);
            while (!Thread.currentThread ().isInterrupted ())
            {
                // Read message contents
                Log.i("Output", "the while loop ran up to here");
                //*HANGS ON THE LINE BELOW*
                String testcase = subscriber.recvStr(0);
                strDisplay.setText(testcase);
                Log.i("Output", "The while loop completed");
            }

现在,经过大量的互联网搜索,我得出了两个结论:

1) recvStr() 是一个阻塞调用,它一直等到它收到一些东西。所以这意味着它没有正确连接或其他原因

2) 我可能需要设置某种过滤器?

我不知道接下来应该做什么。非常感谢有 JeroMQ 或 Android 服务器访问经验的人提供的任何帮助

【问题讨论】:

  • 您是否在代码的更下方使用new Thread(runnable).start()?如果你不是,那么你就在 UI 线程上,这会阻止应用程序。如果你是,那么你不能使用findViewById() 和所有这些东西,因为这些方法应该只在 UI 线程上使用。查看AsyncTask 及其publishProgress() 机制,用于从后台线程获取内容到UI 线程,或在主Looper 上使用Handler
  • @Barend 是的,我用过Thread connect = new Thread(runnable); connect.start();findViewById() 实际上在这里工作。但这些都不是目前的问题。我只知道recvStr() 线路正在挂起所有东西,我想在手续之前先解决这个问题。

标签: android sockets zeromq recv jeromq


【解决方案1】:

您可能需要订阅要从发布者那里获取的主题,或者在建立连接后订阅所有主题。

例如订阅单个主题:

subscriber.subscribe("topic_to_get".getBytes());

订阅每个主题:

subscriber.subscribe("".getBytes());

【讨论】:

  • 我后来确实解决了这个问题,这是正确的答案。这就是我所说的“设置过滤器”可能存在的问题。
猜你喜欢
  • 2012-08-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-29
相关资源
最近更新 更多