당신이 할 수있는 범위에서 사용할 수 없습니다 Receiver 내부의 최종 변수가 아닌 변수를 사용하지 마십시오.
final Long[] temp = {-1};
areaRequest.countByCurrentInstitution().fire(new Receiver<Long>() {
@Override
public void onSuccess(Long response) {
temp[0] = response;
}
});
doSomethingWith(temp[0]);
을하지만 당신이 무엇을 원하는 보통이 아니다 :
신속하고 더러운 변화
는 범위의 문제가 될 것이다 방지 할 수 있습니다.
countByCurrentInstitution()
이 비동기 호출이기 때문에
doSomethingWith()
을 호출 할 때까지
temp[0]
은 여전히
-1
이 될 것입니다. async 메서드가 다른 스레드에서 계속 실행 중이기 때문입니다.
간단한 스레드 인
Thread.sleep()
또는 매우 긴 루프를 사용하여 주 스레드를 조금만 기다릴 수는 있지만, 다시 말하면 빠른 해킹 일 뿐이며 오류가 발생하기 쉽습니다 (호출이 오래 걸리면 어떻게 될까요?).
가장 좋은 방법은 Long temp
도랑 그냥 onSuccess()
방법 내부 코드를 이동하는 것입니다 :
areaRequest.countByCurrentInstitution().fire(new Receiver<Long>() {
@Override
public void onSuccess(Long response) {
doSomethingWith(response);
}
});
나는 당신이 필요 이상으로 힘들어하고 있다고 생각합니다. Walen이 마지막으로 대답 해주었습니다. – Knarf
그 대답은 작동하지 않습니다. 비동기 응답에서 변수를 저장할 수 없습니다. 따라서 이렇게하는 방법은 두 번째 호출에 필요한 변수를 반환하는 함수를 먼저 호출하는 것입니다. 나는 더 열심히하지 않는다. 내 시야에서 이것은 가장 간단한 해결책이다. –