저는 iOS 용으로 코딩 해왔고 Objective-C의 블록 개념에 대해 잘 알고 있습니다. 이제 Android 용 Java를 배우고 일부 앱을 Android에서 iOS로 변환하려고합니다.Java의 완료 핸들러?
나는 자바에서 블록의 완전한 동등 물이 없다는 것을 읽었으므로, 완성 처리기 또는 유사하게 작동 할 수있는 것을 구현하는 최선의 대안이 무엇인지 알고 싶다.
저는 iOS 용으로 코딩 해왔고 Objective-C의 블록 개념에 대해 잘 알고 있습니다. 이제 Android 용 Java를 배우고 일부 앱을 Android에서 iOS로 변환하려고합니다.Java의 완료 핸들러?
나는 자바에서 블록의 완전한 동등 물이 없다는 것을 읽었으므로, 완성 처리기 또는 유사하게 작동 할 수있는 것을 구현하는 최선의 대안이 무엇인지 알고 싶다.
일반적으로 인터페이스 유형. 처리기에 매개 변수가없고 void
반환 유형이 있으면 Rob이 제안한대로 Runnable
(interface
)을 사용할 수 있습니다. 그러나 정의 할 수있을만큼 간단 자신의 :
void setCompletionHandler(CompletionHandler h) {
savedHandler = h;
}
하고 그냥 전화 : 다른 클래스에서
something.setCompletionHandler(new CompletionHandler() {
@Override
public void handle(String reason) {
...
}
});
:
다음interface CompletionHandler {
public void handle(String reason);
}
과 자신의 클래스에 전달하기 방법을 호출하여 :
savedHandler.handle("Some mysterious reason");
이런 종류의 일은 Java Swing과 Android 라이브러리의 "리스너"를 위해 이루어집니다. 예를 들어 View.OnClickListener
을 참조하십시오.
(추신 : 나는 자바 8 람다 이러한 인터페이스의 모든 예제 파일을 사용할 수있을 것으로 생각합니다.) 내가 필요 정확히처럼 보이는
실행할 수 있습니다. 당연히, 블록의 등가물은 자바 8에서 오는 람다를 필요로 할 것이지만, 안드로이드가 그들을 지원할 때까지 얼마나 오래 있는지 알고있다. (그들은 아직도 JUnit 3.8을 사용하고있다.)
예를 들어 블록과 같은 것들을 완료 안드로이드에서 많은 장소가있다 : 당신이 볼 수 있듯이, 당신은 대부분의 익명 클래스의 인스턴스을해야하지만,
this.currentConditionsActivity.runOnUiThread(new Runnable() {
@Override
public void run() {
currentConditionsActivity.onLocationChanged(...);
}
});
instrumentation.waitForIdleSync();
setupViewElements();
IDE를 사용하면 자동 채우기로 인해 상용구의 어리 석음이 완화됩니다. 이것은 Android Studio에서 이루어졌고 새로운 Runnable()을 수행 한 후에 모든 것을 집어 넣었습니다 (코드를 접을 경우 람다와 유사한 구문도 표시됩니다).
지금 상태입니다. 별로 좋지 않은 것 같아 보이지 않습니다 ...
사실, 나는 몇 가지 매개 변수가 필요합니다. 'CompletionHandler' 인터페이스를 한 번만 선언하고 오버라이드 할 때'handle' 메소드를 오버로드하는 것이 가능합니까? – Guilherme
당신은'CompletionHandler'를 한 번만 선언 할 것이고, 네, 같은 문법을'handle'을위한 다른 코드로 여러 번 사용할 수 있습니다. 그렇게 할 때마다 실제로 CompletionHandler를 구현하는 새로운 클래스를 선언하고 있지만 익명 클래스입니다. 같은'handle' 본문을 여러 번 사용하고 싶다면, 그것을 구현하는 명명 된 클래스를 선언 할 수도 있습니다. 그리고 새로운 인스턴스를 만들 수 있습니다. 'setCompletionHandler (새로운 CommonCompletionHandler());'. – ajb