2012년 7월 5일 목요일

안드로이드 콜백 메서드를 이용한 컨트롤러


코드로 대충 알아보는 callBack 구조.

우선 Callback은 자동으로 불려지는게 아닙니다. 누군가는 불러 주어야 하는거죠.


임의로 만든 클래스인 컨트롤러의 내부 클래스로 이런 녀석이 있다고 합시다.

private class ServiceCallback extends aidl service...{



@Override
public void commandStatus(int command, long accountId, int errorCode, int progress,long id) throws RemoteException {
// TODO Auto-generated method stub
synchronized (mListeners) {
                for (Result listener : mListeners) {
                    listener.commandCallback(command,accountId, errorCode, progress,id);
                }
            }
}

}

listener는 해쉬고 순서대로 리스너 들에게 commandCallback을 전달합니다.





콜백을 쓰고 싶은 A라는 액티비티가 있다고 합시다. 쓰는 이유는 어카운트같은 것들과 싱크를 맞추기 위해서.


액티비티의 시작점에서 컨트롤러의 인스턴스를 생성합니다.


@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
.
.
.
mController = Controller.getInstance(getApplicationContext());


mListner = new ResultCallbackListener();


컨트롤러랑 리스너의 인스턴스만 있지만 이름이 워낙 쉬워서 대충 짐작은 갑니다.

private Controller mController;
private ResultCallbackListener mListner;



젤 처음 소스에서 각각의 리스너에게 명령을 지시하는 이유... 콜백 리스너들이 private이기 때문이죠.


-----------------------------------------------------------------------------이걸로 이해 끗.

좀 더 하면 컨트롤러는 대충


public class Controller {

public interface Result {

public void commandCallback(int command,long accountId, int errorCode, int progress,long id);
}


이렇게 생겼습니다. Result란 녀석을 인터페이스로 두고 각 액티비티 들마다 알아서 구현을 하라고 하는 거죠.


A라는 액티비티에서


@Override
public void commandCallback(int command, long accountId, int errorCode,
int progress, long id) {
// TODO Auto-generated method stub

                //A를 화면에 찍어부려 !  syso{Ctrl+Space} <- A
}

이런식으로 구현을 하면 해당 콜백 커맨드가 들어 왔을 때 걍 뭘 찍을 것이고.



class ResultCallbackListener implements Controller.Result {

@Override
public void commandCallback(int command, long accountId, int errorCode,
int progress, long id) {
switch (command) {


요렇게 하면 switch에서 command 인자에 따라 뭘 수행을 하겠죠.

즉 콜백이 오면 각 액티비티에서 알아서 구현을 하면 된다는 것이죠.


implements Result
나 implement Controll.Result 하면

콜백 함수를 구현해야 합니다. 인터페이스를 땡겼으니까 세부 구현은 당연히 해야 하는게 맞겠죠.


컨트롤러는 어떻게 생겼을까...

public class Controller {


public synchronized static Controller getInstance(Context _context) {
if (sInstance == null) {
sInstance = new Controller(_context);
}
return sInstance;
}
.
.
.


걍 클레스죠. 인스턴스 없으면 생성해 주고. 인자를 받습니다. 이 어플의 Context를 받는 거이죠. 즉 어느 액티비티등가네 이 어플의 인스턴스를 받아서 Controller 객체를 생성해 줍니다.


이전 글 포스팅의 예제가 가장 참신 했던 것 같네요.


사실 콜백은 꼭 인터페이스로 구현을 하지 않더라도 뭔가가 바뀌었을 때 해당 객체를 생성해 주는 거면

콜백 매서드라고 할 수 있겠네요.

즉 자기 자신이 뭔가를 하는게 아니라 다른 객체에 의해서 조정되는 매서드가 잇으면 콜백 구조라고...




그렇게 알고 있으렵니다.






















댓글 없음:

댓글 쓰기

국정원의 댓글 공작을 지탄합니다.

UPBIT is a South Korean company, and people died of suicide cause of coin investment.

 UPBIT is a South Korean company, and people died of suicide cause of coin. The company helps the people who control the market price manipu...