2011-02-07 10 views
0

私はBlackberryからのすべてのHTTP要求を担当するクラスを実装しています。私はこのクラスを使ってWebサービスを照会し、そこからデータを取得するために約10か所の画面を持っています。この場合に使用する標準パターンは何でしょうか?Blackberryデザインパターンの質問:

次のように現在、私はそれを設定している -

public class NetworkAccessClass 
{ 

    public NetworkAccessClass(String url, String methodName, Vector paramNames, Vector paramValues, MainScreen screen) { 
     // perform inits 
    } 

    public void run() { 
     // Get Data 
     if(screen.instanceOf(LoginScreen)) { 
      ((LoginScreen) screen).requestSucceded(responseData); 
     } 
     // So on for all 10 screens. 
     catch() { 
      ((LoginScreen) screen).requestFailed(errorCode); 
      // So on for all 10 screens. 
     } 
    } 

} 

それは動作しますが、右を見ていない、と一つの画面に複数の種類のネットワーク要求を持っている場合、私はにフラグを追加することを余儀なくされていますがどの機能がコールバックされるのかを把握しておく必要があります。

これを行うより良い方法はありますか?

ありがとう、
Teja。

答えて

3

コールバックインターフェイスを使用します。 ResponseHandler

public class NetworkAccessClass 
{ 

    public interface ResponseHandler { 
     void requestSucceeded(ResponseData responseData); 
     void requestFailed(ErrorCode errorCode); 
    } 

    public NetworkAccessClass(
     String url, 
     String methodName, 
     Vector paramNames, 
     Vector paramValues, 
     ResponseHandler responseHandler) { 
     // perform inits 
    } 

    public void run() { 
     // Get Data 
     try { 
      ... 
      responseHandler.requestSuceeded(responseData); 
     catch() { 
      responseHandler.requestFailed(errorCode); 
     } 
    } 
} 

これがうまくいけば、すべての画面について知るから、あなたのNetworkAccessClassを切り離します。次に、画面にNetworkAccessClass.ResponseHandlerが実装されているか、アダプタハンドラ(匿名の内部クラス)が渡されて、画面上の適切なメソッドが呼び出されます。

public interface NetworkListener { 
    void requestSucceeded(byte[] responseData); 
    void requestFailed(int errorCode); 
} 

public class NetworkAccess { 
    // ... 

    public void run() { 
     // Get Data 
     if (successful) { 
      fireSucess(responseData); 
     } 
     catch(SomeException e) { 
      fireFailure(errorCode); 
     } 
    } 

    public void addNetworkListener(NetworkListener listener) { 
     // add listener to list of listeners 
    } 

    private void fireSuccess(byte[] responseData) { 
     for (NetworkListener l : listeners) { 
      l.requestSucceeded(responseData); 
     } 
    } 

    // ... 
} 

public class LoginScreen { 
    private void foo() { 
     NetworkAccess access = new NetworkAccess(...); 
     access.addNetworkListener(new NetworkListener() { 
      public void requestSucceeded(byte[] responseData) { 
       // do what you want 
      } 
      public void requestFailed(int errorCode) { 
       // do what you want 
      } 
     }); 
    } 
} 

これは、観察可能/ Observerパターンとして知られています:

class LoginScreen { 
    ... 
     new NetworkAccessClass(url, methodName, paramNames, paramValues, 
      new ResponseHandler() { 
       @Override 
       void requestSucceeded(ResponseData responseData) { 
        LoginScreen.this.handleLoginSuccess(responseData); 
       } 
       @Override 
       void requestFailed(ErrorCode errorCode) { 
        LoginScreen.this.handleLoginFailure(errorCode); 
       } 
    } 
    ... 
} 
1

あなたは興味深い何かが起こるたびネットワーククラスは、コールバックしまうシンプルなインターフェイスでリスナーを、使用することができます。観察可能なものは何かが起こったときに観察者に通知するが、正確なタイプを知る必要はない。 listsnerクラスは、2つのパーティを切り離します。

関連する問題