次の 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 に渡すには、このクラスをどのように設計すればよいでしょうか??