2017-06-19 76 views
0

我想在Android應用程序中使用ZMQ。理想情況下,我應該在應用程序關閉時創建一次和定義上下文()。如何在Android應用程序中創建ZMQ上下文

但不同的是C++應用程序。 android上沒有main()函數。基於有關activity life cycle的Google文檔。函數onCreate(),onStop()可以被多次調用,函數onDestroy()只能被系統調用。

解決方法1:創建/銷燬ZMQ上下文中一個的AsyncTask()。但那樣會非常昂貴。

溶液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的工作室:2.3.3

ZMQ:org.zeromq:jeromq:0.4.0

回答

1

我認爲你應該使用singletone實例作爲更直接的解決方案。

在Android所有網絡通信必須保持是一個單獨的線程(未UI線程)。所以當你中斷網絡線程時,你可能會指定ZMQ.Context。如果您的應用程序不需要後臺網絡連接(僅在單獨的活動中執行網絡連接),則出於性能原因,最好在這些活動的onPause()方法中指定ZMQ.Context。

我使用這種方法,但滿足終止SUB插口問題。雖然我認爲這種方法非常好。

相關問題