0

次の 3 つのクラスの設計に問題があります。
UserManager - sessionManager を使用してサーバーからデータを取得する
SessionManger - WebRequest を使用して Web サーバーで Web セッションと要求を処理し、要求間のアイドル時間が最大許容
WebRequest - POSTを超えている場合にユーザーを自動ログインします。データを Web サイトに送信し、その応答を返します (これは非同期クラスです)

// Posts dat to web server and returns response using Interface
public class WebRequest extends AsyncTask<String, Integer, byte[]> {
    interface DoneInterface {
        void onSuccess(byte []data);
        void onError(Exception e, String message);
    };
  // Sets interface to be called when request from server is done
  public void onDone(DoneInterface callable)
  // Requests data from server
  public boolean PostUrl(String url);

  // ... other methods, variables
}

// Handles auto login of user 
public class SessionManager {
    private WebRequest webRequest = null;

    // Creates request on web server, "callback" is interface that should be called when 
    // WebRequest instance is done with downloading response    
    public void Request(String url, HashMap data, WebRequest.DoneInterface callback) {
    webRequest.onDone(new WebRequest.DoneInterface() {    
      @Override
      public void onSuccess(byte[] data) {
        // HERE I NEED TO DO SOME ACTION BEFORE CALLING callback.onSuccess 
        // that was passed as argument and will process data     

        callback.onSuccess(data);               
      }

      @Override
      public void onError(Exception e, String message) {
        // IF error, we will need to crate new session probalby
        sandManager = null;

        // Call callback (interface) passed as argument
        callback.onError(e, message);
      }
    });
    webRequest.PostUrl(url);
  }
  // ... other methods, variables
}

// Main class
class User {
  private SessionManager session = new SessionManager();

  public SomeMethod() {
    session.Request(new WebRequest.DoneInterface() {    
      @Override
      public void onSuccess(byte[] data) {
        // Here I need to process data received from web server                     
      }

      @Override
      public void onError(Exception e, String message) {}
    });
  }
}

このエラーが発生しています Cannot refer to a non-final variable "callback" inside an inner class defined in a different method(SessionManager, callback.onSuccess(data);行)。それは、「コールバック」変数が ではないためfinalです。しかし、WebRequest から返されたデータを SessionManager 内で変更してから User に渡すには、このクラスをどのように設計すればよいでしょうか??

4

1 に答える 1

0

変数を作成しても、それを行うことができますfinalfinalローカル変数に新しい値を割り当てることができないことのみを意味します。これは、ローカル変数が内部クラスに配置されてから変更された場合の混乱を避けるためです。callback新しいコールバックを再指定する必要がない場合は、final制限されません。ただそれを作ってfinalください、そして私を信じてください、すべてが大丈夫です.

于 2013-09-21T17:36:55.213 に答える