마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

구조에 대해서 궁금한게 있습니다.

0 추천

안녕하세요.

조금 심오한 질문이 될수도 있겠네요..

질문이 심오하고 글이 넘 장문이라 답변해주실 분이 계실지 모르겠습니다.ㅠㅠ

다름이 아니라 인터페이스를 이용하여 콜백을 만들고 구조를 잡던중 조금 막히는게 있어서 질문 남기게 되었습니다.

먼저 Interface ResultCallback 이라는 인터페이스를 통해서 콜백을 만들게 되었습니다.

메인클래스와 다운로드클래스가 있는데요.

다운로드 클래스에는 다운로드 완료후 관련 정보를 콜백으로 메인클래스로 넘겨주게 되어있습니다.

예)

Interface ResultCallback{

public void completeCompositeYouTubeURL(String compositeURL, String fileName);
public void completeCompositeYouTubeURL(String compositeURL, String fileName, int position);

}

 

D Class

   /**
    * 
    * 요약 : 유투브의 원본 url을 가져와 다운로드 가능한 url로 합성 변환시켜준다.
    * @param url 동영상의 원본 주소를 받는다.
    * @param position 포지션 또는 키값을 기록해야될 경우 인덱스값으로 활용한다. 없다면 기본 0값 입력.
    * @param callbackListener 결과값을 받을 리스너를 설정한다.
    * @throws IOException
    */
   public void compositeURL(String url, int position, YouTubeURLDecodingCompleteCallback callbackListener) throws IOException {
  this.position = position;
  composite(url, callbackListener);
    }
   
   /**
    * 
    * 요약 : 유투브의 원본 url을 가져와 다운로드 가능한 url로 합성 변환시켜준다.
    * @param url
    * @param callbackListener 결과값을 받을 리스너를 설정한다.
    */
   private void composite(String url, YouTubeURLDecodingCompleteCallback callbackListener) {
       ConnectivityManager connMgr = (ConnectivityManager)mContext.getSystemService(Context.CONNECTIVITY_SERVICE);
       NetworkInfo networkInfo = connMgr.getActiveNetworkInfo(); // 네트워크 상태 체크
       if (networkInfo != null && networkInfo.isConnected()) {
           String sharedText = url;
           if (linkValidator(sharedText) == "not_a_valid_youtube_link") { //유효한 주소 값인지 체크 로직 실시
            Toast.makeText(mContext, "유효한 유투브 주소가 아닙니다.", 1000).show();
           } else if (sharedText != null) { //유효한 로직이며 텍스트가 널이 아닐 경우
            setCompleteCompositeListener(callbackListener);
            asyncDownload = new AsyncDownload();
            asyncDownload.execute(validatedLink); //다운로드 AsyncTask로 주소값 전달
           }
       } else {
        Toast.makeText(mContext, "현재 통신환경이 불안정합니다.", 1000).show();
       }
   }
 
콜백으로 전달합니다.
String compositeURL = links.get(0);
mCallbackListener.completeCompositeYouTubeURL(compositeURL, title, position); //콜백으로 Composite된 URL을 넘긴다.
links.clear(); 
        }

 

메인클래스

youTubeURLGenerator.compositeURL(originaURL, 0, new YouTubeURLDecodingCompleteCallback() {
 
@Override
public void completeCompositeYouTubeURL(String compositeURL, String fileName, int position) {
    //콜백인터페이스의 1번째
}
@Override
public void completeCompositeYouTubeURL(String compositeURL, String fileName) {
// TODO Auto-generated method stub
//콜백 인터페이스의 2번째
}
});
 
 
}
 
@Override
public void completeCompositeYouTubeURL(String compositeURL, String fileName) {
// TODO Auto-generated method stub
Log.i("인터페이스2", "" + fileName);
}
});

메인클래스에서는 이와 같이 콜백을 받습니다.

그런데 문제가 compositeURL 호출을 보시면 다 동일한데 position이라는 값을 넘길때가 있고 넘기지 않을때가 있습니다.

position값을 넘기면 콜백으로도 position 값이 넘어와야 하기 때문에 

Interface ResultCallback{

public void completeCompositeYouTubeURL(String compositeURL, String fileName);
public void completeCompositeYouTubeURL(String compositeURL, String fileName, int position);

}

이 두개중 아래쪽의 콜백으로 데이터를 넘기게 됩니다.

반대로 position을 넘기지 않을 경우에는 첫번째로 넘기게 됩니다.

그런데 메인클래스에서 이 콜백을 구현할때는 포지션을 넘기는 상황에서든 넘기지 않는 상황에서든 

두개의 메서드를 모두 오버라이딩 해야되는데요.

이렇게 되면 값이 넘어오지 않는 콜백 메서드까지 오버라이딩 되어 표시되면 혼란을 주지 않을까 싶습니다. 

만약 position 값을 넘기지 않았을 경우 position 값을 받을 필요가 없기 때문에 해당되는 콜백 즉,

public void completeCompositeYouTubeURL(String compositeURL, String fileName, int position); 은 오버라이딩 표시

가 안되게 하고 싶은데요..

이렇게 하려면 구조를 어찌 잡아야 되는지 난해합니다. 

갸아악 (21,260 포인트) 님이 2014년 8월 11일 질문

2개의 답변

+1 추천
 
채택된 답변
앞선 답변 외에 한가지 방법이 더 있습니다.

위 인터페이스를 구현하는 단순 클래스를 하나 만든다음

리스너 객체를 넘길 때 익명 클래스로 해당하는 콜백 하나만 오버라이딩 하는 방법입니다.
b22n (22,940 포인트) 님이 2014년 8월 11일 답변
갸아악님이 2014년 8월 13일 채택됨
+1 추천

몇가지 방법이 있습니다.

  1. position을 받는 인터페이스와 받지 않는 인터페이스 2개를 따로 만들고 콜백을 구현하는 클래스에서 자신이 필요한 것만 구현한다.
  2. public void completeCompositeYouTubeURL(String compositeURL, String fileName, int position) 만 사용하고, position값이 필요없는 경우에는 음수를 넘긴다.
익명사용자 님이 2014년 8월 11일 답변
...