음... 먼저 콜백, 리스너, 옵저버 패턴 등에 대해서 이해를 하셔야만 될 것 같은데요. 콜백은 버튼에 Button.setOnClickLisetner(new View.OnClickListener()...) 한거랑 같다고 보시면 됩니다. 시스템에 리스너를 등록해 두고 시스템이 클릭이 발생하면 리스너에 있는 메소드를 호출해 주는 겁니다. 마찬가지로 AsyncTask에 리스너를 등록해 두고 해당 이벤트가 발생하면 등록된 리스너의 메소드를 통해 알려주는 겁니다. 이 메카니즘이 이해가 안되시면, 위의 코드는 사용하시기가 좀 그럴 듯 합니다. 모바일앱 개발은 이런 리스너를 엄청 나게 자주 사용하게 되기 때문에 반드시 이해를 하시고 넘어가셔야 하는데, 별로 대단한 것이 아닙니다.
이미 필요한 소스는 다 보신 상태예요. 그래도 다시 설명드리면...
1. 먼저 HttpConnection을 별도의 클래스 파일로 분리하세요.
//HttpConnection.java
public class HttpConnection extends AsyncTask<URL, Integer,String>{...}
2. 리스너로 사용할 인터페이스를 추가합니다. 헷갈려 하시니까 이것도 별도의 클래스 파일로 선언합니다. 리스너를 사용하는 이유는 HttpConnection에서 네트워크 작업이 언제 끝날 지 알 수가 없기 때문입니다. 이해가 더 잘가시도록 한가지 예를 들게요. 어떤 가게에 사고 싶은 물건이 있는데, 재고가 없어요. 그 가게 주인이 쪽지하나를 내밀면서 "여기 연락처와 어떤 물건이 필요한지 알려주시면 물건이 들어오면 알려드릴게요"라고 했습니다. 그럼, 나는 그 쪽지에 내 연락처와 원하는 물건을 적어주면 되죠. 그럼, 나중에 그 물건이 들어오면, 주인으로부터 연락을 받겠죠. 리스너(=콜백)가 이 쪽지에 해당하는 겁니다. 콜백 메소드들은 물건에 해당한다고 보면 되구요. 쪽지에 내용을 적는 행위는 아래에 나오는 setListener가 되는 거구요.
//HttpConnectionListener.java
public interface HttpConnectionListener {
void onTaskError(String erroMessage);
void onTaskSuccess(String data);
}
3. HttpConnection 클래스에 HttpConnectionListener를 추가합니다. 이 리스너를 통해 외부와 통신을 할 겁니다. 이 리스너를 나중에 액티비티 쪽에서 setListener를 통해 등록하고 리스너의 메소드가 호출이 되면 처리하면 되겠죠. 버튼 클릭 리스너와 같은 동작 원리입니다.
public class HttpConnection extends AsyncTask<URL, Integer,String> {
private HttpConnectionListener listener;
public void setListener(HttpConnectionListener listener) {
this.listener = listener;
}
...
}
4. HttpConnection에서 해당 이벤트가 발생하면, listener를 통해 알려줍니다. 매장에 물건이 들어오면(네트워크를 통해 서버로 부터 응답을 받으면), 알려달라고 한 고객에게 알려줘야 겠죠?
public class HttpConnection extends AsyncTask<URL, Integer,String> {
// onPreExecute 삭제. 로딩바 보여주는 걸 HttpConnection을 호출하는 쪽에서 처리할 겁니다.
@Override
protected String doInBackground(URL... urls) {
String data = "";
if (urls.length == 0) {
return "URL is empty.";
}
try {
RequestHttpURLConnection connection = new RequestHttpURLConnection();
return connection.request(urls[0]); // 성공하면 서버에서 받은 String을 리턴.
}catch (Exception e) {
return null; // 에러가 나면 null을 리턴.
}
}
@Override
protected void onPostExecute(String data) {
if (data == null) {
// 고객님, 죄송합니다. 물건을 받는데 문제가 생겼습니다.
// data == null 이란 의미는 앞의 doInBackground에서 에러가 났다는 말이므로 리스너에 에러를 통보합니다.
if (listener != null) {
listener.onTaskError("여기에 의미있는 에레메세지");
return;
}
}
// 고객님, 물건이 새로 들어왔습니다.
// 에러가 아니면 성공이므로 리스너의 onTaskSuccess를 호출해 줍니다.
if (listener != null) {
listener.onTaskSuccess(data);
}
}
}
}
이렇게 HttpConnection 과 이 클래스를 사용하는 외부 간에 리스너를 통해 메세지를 주고 받을 수 있는 준비가 되었습니다. 여기까지 이해가 가시면 좋겠네요. 만약 이해가 가지 않으시면 멈추신 상태로 자바와 기본적인 디자인 패턴 공부를 하시기를 추천드립니다.