2017-06-19 6 views
0

アンドロイドアプリケーションで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

答えて

1

私はあなたがsingletoneを使用しなければならないと思いますより簡単な解決策として

Androidでのすべてのネットワーク通信は、別のスレッド(UIスレッドではない)である必要があります。したがって、ネットワーキングスレッドを中断すると、ZMQ.Contextという言葉が使われることがあります。あなたのアプリがバックグラウンドでネットワーク接続を必要としない場合(別のアクティビティでのみネットワーキングを実行する)、パフォーマンス上の理由から、それらのアクティビティのonPause()メソッドでZMQ.Contextを使用する方が良いでしょう。

私はこのようなアプローチを採用していますが、SUBソケットの終了に問題があります。私はこのアプローチがかなりうまくいくと思いますが。

関連する問題