アンドロイドアプリケーションでZMQを使用しようとしています。理想的には、コンテキストを一度作成し、アプリケーションが終了するときにterm()する必要があります。アンドロイドアプリケーションでZMQコンテキストを作成する方法
しかし、C++アプリケーションとは異なります。アンドロイドにはmain()関数はありません。 activity life cycleについてのGoogleドキュメントに基づいています。関数onCreate()、onStop()は複数回呼び出すことができ、関数onDestroy()はシステムによってのみ呼び出されます。
Solution1:asyncTask()でZMQコンテキストを作成/破棄します。しかし、それは非常に高価になります。
解決策2:スレッドAndroid global variableに基づいて、グローバル変数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;
}
}
シングルトンクラスを作成すると、シングルトンの問題は、私は手動でいくつかの段階でZmqHelper.release() //which calls context.term()
を呼び出す必要がありソリューション2と同じです。私は、zmqコンテキストを破壊するために関数のterm()を呼び出すのが良い場所がどこにあるのか不明です。
アンドロイドアプリケーションでZMQコンテキストを作成/終了する正しい方法は何ですか?
ENV:
のUbuntu:16.04 LTS
アンドロイドスタジオ:2.3.3
ZMQ:org.zeromq:jeromq:0.4.0