1

アプリケーションに基本的なレンダリング機能を提供するために、Android でライブラリを開発しています。私の目的は、GLSurfaceView (ライブラリがこの glsurfaceview の所有権を持っている) でタッチ入力を読み取り、いくつかの値を計算してアプリケーションに戻り、受け取ったパラメーターに従って動作することです。これは、ライブラリによってアプリケーションに対して発生する割り込みとして視覚化できます。これを達成するには、ライブラリがイベントを通知し、クライアントがパラメーターで必要なことを実行できるように、クライアントに何らかのメカニズムを適用する必要があります。可能な構成の1つはインターフェイスを使用できますが、ライブラリにはインスタンスがないためアプリケーション アクティビティでは、必要な機能を呼び出すことができません。

ここで最適なメカニズムは何ですか?

4

1 に答える 1

1

ここで考慮する必要があるのは、入力と出力の 2 つの部分です。

ユーザー入力

ライブラリで処理する必要があるイベントが Android イベントにマップされる場合、メソッド名とシグネチャを複製しboolean、呼び出しが既に処理されたかどうかを示す値を返す既存のライブラリの一部で使用されているものと同様のアプローチを使用します。

そのために、ライブラリとユーザー アクティビティの間のブリッジとして機能するクラスを作成し、次のメソッドを定義します。

public boolean onKeyDown (int keyCode, KeyEvent event) {
    // Handle here the key event in the appropriate way
    // if the pressed key was not to be handled by your library, simply return false
    // else, handle it and return true
}

次に、呼び出し元のアクティビティで、同じメソッドをオーバーライドし、適切に呼び出します

// We assume your bridge class is already instantiated and called `bridge`
@Override
public boolean onKeyDown (int keyCode, KeyEvent event) {
    super.onKeyDown(keyCode, event);

    if (bridge.onKeyDown(keyCode, event)) {
        return true;
    }

    // User code for other keys here
}

onStart必要に応じて、このパターンを他のメソッドに拡張します。これは、 のAction Bar Drawer Toggleなど、一部の Android サポート ユーティリティで既に使用されていますonOptionsItemSelected。私は個人的にヘルパーでこのパターンを使用しており、非常にうまく機能しています。

データ出力

実行している処理の種類によっては、ブリッジ クラス メソッドを介して、またはリスナーを使用して、結果を直接公開することができます。

計算が高速で、常にgetではないが頻繁に必要な場合は、メソッドを使用すると便利な場合があります。

public Object getResult () {
    // Use an appropriate return type and method name
}

ただし、結果が遅いため、または処理時に 1 回しか使用されないために結果が別のスレッドで実行される場合は、 LoadersフレームワークCallbacksに見られるものと同様のタイプのインターフェースを使用する方がよい場合があります。

ブリッジ クラス内で、次のようなインターフェイスを定義します。

public class Bridge {

    interface Callbacks {
        void onSomeResultComputed (Object result);
        void onSomeOtherResultComputed (Object result);
        // etc.
    }

    // Other methods and fields
}

次に、特定のメソッドを使用するか、onCreate上記のパターンに従う を使用して、クライアントにこのコールバックを登録させます。クライアントコードは次のようになります

public class SomeActivity implements Bridge.Callbacks {

   [...]

   @Override
   protected void onCreate () {
       super.onCreate();
       bridge.onCreate(this);
   }

   [...]

   @Override
   public void onSomeResultComputed (Object result) {
       // Handle the result here
   }

   @Override
   public void onSomeOtherResultComputed (Object result) {
       // Handle the result here
   }
}

繰り返しになりますが、Google はすでに、ローダーなどの一部の Android ユーティリティや一部の Google Play Services クラスでこのパターンを使用しており、非常にうまく機能しています。

リスナーの場合は、コストのかかる計算を並列スレッドで実行し (場合によっては を使用AsyncTask)、メイン スレッドで常にCallbacksメソッドを再度呼び出すことを忘れないでください。

于 2013-10-28T11:30:18.787 に答える