0

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

但与 c++ 应用程序不同。android 上没有 main() 函数。基于关于活动生命周期的谷歌文档。函数onCreate()、onStop()可以被多次调用,函数onDestroy()只被系统调用。

解决方案 1:在 asyncTask() 中创建/销毁 ZMQ 上下文。但这将非常昂贵。

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

解决方案3。创建单例类

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 上下文的正确方法是什么?

环境:

Ubuntu:16.04 LTS

安卓工作室:2.3.3

ZMQ:org.zeromq:jeromq:0.4.0

4

1 回答 1

1

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

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

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

于 2017-06-19T10:51:50.710 回答