如何在Android应用程序中创建ZMQ上下文

时间:2017-06-19 00:17:55

标签: android zeromq jeromq

我正在尝试在Android应用程序中使用ZMQ。理想情况下,我应该创建上下文一次,并在应用程序关闭时使用term()。

但与c ++应用程序不同。 android上没有main()函数。基于有关activity life cycle的Google文档。函数onCreate(),onStop()可以多次调用,函数onDestroy()只能由系统调用。

Solution1:在asyncTask()中创建/销毁ZMQ上下文。但那将是非常昂贵的。

解决方案2:基于线程Android global variable,我可以创建一个全局ZMQ.Context context变量。这种方法的问题是:没有适当的函数来调用context.term();

solution3。创建单例类

import org.zeromq.ZMQ;

public class ZmqHelper {
    private static ZMQ.Context _context;

    public static ZMQ.Context createContext(){
        return getContext();
    }

    public static ZMQ.Context getContext(){
        if(_context == null) {
            _context = ZMQ.context(1);
        }
        return _context;
    }

    private ZmqHelper(){
    }

    public static boolean release(){
        // make sure all sockets are closed
        if(_context != null) {
            _context.term();
            _context = null;
            return true;
        }
        return false;
    }
}

单身人士的问题与解决方案2相同。我必须在某个阶段手动调用ZmqHelper.release() //which calls context.term()。我不确定调用函数term()来销毁zmq上下文的好地方。

那么在Android应用程序中创建/终止ZMQ上下文的正确方法是什么?

ENV:

Ubuntu:16.04 LTS

Android studio:2.3.3

ZMQ:org.zeromq:jeromq:0.4.0

1 个答案:

答案 0 :(得分:1)

我认为你应该使用单一实例作为更直接的解决方案。

Android上的所有网络通信必须是一个单独的线程(不是UI线程)。因此,当您中断网络线程时,您可以使用ZMQ.Context。如果您的应用程序不需要后台网络连接(仅在单独的活动中执行网络连接),最好在出于性能原因的那些活动的onPause()方法中使用ZMQ.Context。

我正在使用这种方法但遇到终止SUB套接字的问题。虽然我认为这种方法很好。