我正在尝试在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
答案 0 :(得分:1)
我认为你应该使用单一实例作为更直接的解决方案。
Android上的所有网络通信必须是一个单独的线程(不是UI线程)。因此,当您中断网络线程时,您可以使用ZMQ.Context。如果您的应用程序不需要后台网络连接(仅在单独的活动中执行网络连接),最好在出于性能原因的那些活动的onPause()方法中使用ZMQ.Context。
我正在使用这种方法但遇到终止SUB套接字的问题。虽然我认为这种方法很好。