2013-09-21 1 views
0

asynchronus 콜백 :
UserManager이 -
SessionManger이 SessionManager에를 사용하여 서버에서 데이터를 retreive를 - 웹 세션을 사용하여 웹 서버에서 요청을 처리 WebRequest 클래스를 사용자를 자동 로그인하는이
WebRequest 클래스 허용 된 최대 값보다 더 큰 요구 사이의 유휴 시간 때 - 웹 사이트에 POST 데이터를하고 응답의 반환설계하는 방법이 I는 나의 세 가지 클래스 설계에 문제가

// 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이 아니기 때문에 그것이 무엇인지 알고있다. 하지만 이 클래스를 어떻게 디자인해야합니까? 데이터를으로 변경하면 UserA로 전달하기 전에 WebReequest 이 SessionManager 내에 반환됩니다.

+2

당신이 말하는 것을 할 필요가 있고, 당신의 방법 매개 변수를'final'로 선언해야합니다. –

+0

아무 일도하지 않는 것 같습니다. – Elazar

답변

0

변수가 final이더라도 그렇게 할 수 있습니다. final은 로컬 변수에 새 값을 할당 할 수 없다는 것을 의미합니다. 그것은 지역 변수를 내부 클래스에 넣은 다음 변경하면 혼란을 피하기위한 것입니다. 새로운 콜백에 callback을 회신하지 않으실 경우 final이 귀하를 제한하지 않습니다. 그냥 final으로 만들고, 나를 믿어도 모든 것이 괜찮을 것입니다.

+0

그것이 작동하는 것, 나는 지금 바보 같은 느낌 : D 조 – Buksy

관련 문제