2013-12-23 4 views
0

현재 일부 Android 앱 개발을하고 있습니다. 나는 이벤트 중심 프로그래밍에 익숙하지 않다. 그래서 이것은 아마도 초보자 질문 일 것입니다. 다음 로직을 상상해보십시오 :N 비동기 서비스 호출 응답을 클라이언트 응답 1 개로 통합

class A { 
    function1() { 
     call function2(new Callback()) 
    } 

    class Callback implements OnFunction2Done { 
     @Override 
     onFunction2Done() { 

     } 
    } 
} 

class B { 
    function2(Callback callback) { 
     foreach item 1 - n { 
      // call external service which responds via async callback 
     } 
    } 
} 

기본적으로 function1은 다른 클래스에서 function2를 호출합니다. 호출의 일부로 function2가 모든 작업을 완료하면 호출되는 콜백 루틴 핸들도 제공합니다. 문제는 function2 자체가 N 비동기 서비스 호출을하고 있다는 것입니다. for 루프 (function2 내)의 모든 비동기 서비스 호출이 완전히 완료된 후에 만 ​​콜백 루틴 (onFunction2Done())이 호출되도록하는 가장 좋은 방법은 무엇입니까? 추천 솔루션 인 onFunction2Done()이 function2에서 "n"응답을 통합하는 작업 (루프를 통해 매번 하나씩)을 수행하는 것도 좋습니다.

감사합니다.

class B { 
    int counter; 
    function2(Callback callback) { 
    counter = n; 
    foreach item 1 - n { 
     //send stuff to external service, service responds in onResponseOrError 
    } 
    } 
onResponseOrError() { 
    --counter; 
    if (counter == 0) 
     callback.onFunction2Done(); 
} 
} 

+0

당신이 외부 서비스에 foreach 루프를 이동할 수 있습니다 –

답변

0

다음은 항상 외부 서비스에서 응답 (또는 오류 콜백)의 일종을 얻을 가정 내 (아마도 순진) 솔루션입니다 ?
+0

감사합니다 Svenoaks! 나는 또한 같은 라인을 따라 생각하고있다. 그러나 카운터를 모니터링하기 위해 다른 스레드를 생성하는 대신 callback.onFunction2Done()을 onResponseOrError()에서 한 번 호출하는 것이 더 좋지 않습니까? counter == 0? 거기에 더 우아한 해결책이 있기를 바랬습니다. 누군가가 그 우아한 해결책을 게시 할 때까지 나는 이것으로 그냥 갈 것입니다. – Fayez

+0

맞아, 새 스레드를 그리 중요하게 생각하지 않아. 흠, 나는 그 모든 것을 우아하지 않은 것으로 보지 않습니다 (실을 제거한 상태로). 리스너가 정적이 아닌 내부 클래스를 사용하는 경우 메모리 누출을 만들 가능성이 크지 만 여기에서 볼 수있는 문제가 있습니다. http://stackoverflow.com/questions/10864853/when-exactly-is-it-leak-safe-to-use-anonymous-inner-classes를 읽어야합니다. 잘못 구현하면 Activity가 GC를 얻지 못할 수 있습니다. –