2014-02-27 2 views
8

저는 iOS 용으로 코딩 해왔고 Objective-C의 블록 개념에 대해 잘 알고 있습니다. 이제 Android 용 Java를 배우고 일부 앱을 Android에서 iOS로 변환하려고합니다.Java의 완료 핸들러?

나는 자바에서 블록의 완전한 동등 물이 없다는 것을 읽었으므로, 완성 처리기 또는 유사하게 작동 할 수있는 것을 구현하는 최선의 대안이 무엇인지 알고 싶다.

답변

17

일반적으로 인터페이스 유형. 처리기에 매개 변수가없고 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 람다 이러한 인터페이스의 모든 예제 파일을 사용할 수있을 것으로 생각합니다.) 내가 필요 정확히처럼 보이는

+0

사실, 나는 몇 가지 매개 변수가 필요합니다. 'CompletionHandler' 인터페이스를 한 번만 선언하고 오버라이드 할 때'handle' 메소드를 오버로드하는 것이 가능합니까? – Guilherme

+0

당신은'CompletionHandler'를 한 번만 선언 할 것이고, 네, 같은 문법을'handle'을위한 다른 코드로 여러 번 사용할 수 있습니다. 그렇게 할 때마다 실제로 CompletionHandler를 구현하는 새로운 클래스를 선언하고 있지만 익명 클래스입니다. 같은'handle' 본문을 여러 번 사용하고 싶다면, 그것을 구현하는 명명 된 클래스를 선언 할 수도 있습니다. 그리고 새로운 인스턴스를 만들 수 있습니다. 'setCompletionHandler (새로운 CommonCompletionHandler());'. – ajb

3

실행할 수 있습니다. 당연히, 블록의 등가물은 자바 8에서 오는 람다를 필요로 할 것이지만, 안드로이드가 그들을 지원할 때까지 얼마나 오래 있는지 알고있다. (그들은 아직도 JUnit 3.8을 사용하고있다.)

예를 들어 블록과 같은 것들을 완료 안드로이드에서 많은 장소가있다 : 당신이 볼 수 있듯이, 당신은 대부분의 익명 클래스의 인스턴스을해야하지만,

this.currentConditionsActivity.runOnUiThread(new Runnable() { 
     @Override 
     public void run() { 
      currentConditionsActivity.onLocationChanged(...); 
     } 
    }); 
    instrumentation.waitForIdleSync(); 
    setupViewElements(); 

IDE를 사용하면 자동 채우기로 인해 상용구의 어리 석음이 완화됩니다. 이것은 Android Studio에서 이루어졌고 새로운 Runnable()을 수행 한 후에 모든 것을 집어 넣었습니다 (코드를 접을 경우 람다와 유사한 구문도 표시됩니다).

지금 상태입니다. 별로 좋지 않은 것 같아 보이지 않습니다 ...

+0

감사합니다. 그냥 또 다른 빠른 질문, 얼마나 정확하게 메서드를 선언하고, 어떻게 처리기를 호출합니까? – Guilherme

+0

모든 실행 파일에는 메소드 실행 기능이있어서 Android Studio에서 바로 실행할 수 있습니다. 자신 만의 익명 클래스도 정의 할 수 있습니다. 인터페이스를 선언 한 다음 새 () {}을 수행하면 메소드를 삭제하거나 메소드를 추가 할 수있는 옵션이 제공됩니다. – Rob

+0

@Rob 결국 어떻게 했습니까? 모든 간단한 샘플 코드를하시기 바랍니다 – JayVDiyk

관련 문제