2010-05-25 7 views
6

저는 안드로이드에서 시작하고 있습니다. 자바는 녹슬지 않습니다. 나는 전에 이와 같은 다른 함수에 중첩 된 함수를 본 기억이 없다. 누군가가 내게 정확히 무엇을 설명 할 수 있었을까요? 왜 이런 식으로 다른 함수를 중첩시킬 수 있을지 설명해 주시겠습니까?누군가이 자바 코드를 설명 할 수 있습니까

private final Handler handler = new Handler() { 
     @Override 
     public void handleMessage(final Message msg) { 
      Log.v(Constants.LOGTAG, " " + ReviewList.CLASSTAG + " worker thread done, setup ReviewAdapter"); 
      progressDialog.dismiss(); 
      if ((reviews == null) || (reviews.size() == 0)) { 
       empty.setText("No Data"); 
      } else { 
       reviewAdapter = new ReviewAdapter(ReviewList.this, reviews); 
       setListAdapter(reviewAdapter); 
      } 
     } 
    }; 

답변

27
  • 이 제품은 Anonymous Class입니다. 실제로 발생하는 것은 하위 클래스 HandlerhandleMessage 함수로 다시 작성된 입니다. 익명 클래스에 대한 가장 우아한 것의

    하나는 당신이 원샷 클래스가 필요 정확히 을 정의 할 수 있다는 것입니다. 또한 익명 클래스는 코드의 복잡함을 줄이기 위해 이라는 간결한 구문을 사용합니다.

  • 는 또한 "누군가 이 final 가 않습니다 정확히 나에게 설명 할 수 없습니다"물었다. 좋은 설명 can be found here. final 키워드 내가 handler = null; 또는 handler = new Handler() { ... } 당신의 예제 코드 후 라인을 쓸 수 없습니다 의미 변수 "처리기"의 새로운 인스턴스/널 인스턴스를 할당 할 수있는에서 사람을 중지 귀하의 예제의 경우

    .

+0

그게 좋은 사람이 많은 – dubbeat

3

이것은 익명의 클래스로 알려져 있습니다. 여기에서 자세한 설명을 볼 수 있습니다 .... (link)

2

이 코드는 Handler 클래스의 인스턴스를 만들고 동시에 Handler의 "handleMessage"메서드를 재정의합니다.

2

이것은 (a) Handler 인터페이스를 구현하거나 (b) Handler 클래스를 확장하는 익명의 클래스입니다.

8

Java 코드를 작성한 것 같습니다.). 그것은 Manning book Unlocking Android - http://code.google.com/p/unlocking-android/의 예제 중 하나입니다. 이 책의 목표는 자바를 세부적으로 다루는 것이 아니라 안드로이드에 초점을 맞추는 것이었지만 혼동을 일으킨다면 사과드립니다.

여기서 답은 그 문맥 밖의 다른 곳에서는 사용되지 않기 때문에 의도적으로 익명의 내부 클래스입니다.

안드로이드로 시작하는 경우, 내가 추가 할 것이라고 한 노트, 나는 더 새로운 책을 갈 것입니다. Mark Murphy의 CommonsWare 서적은 꽤 좋으며 (http://commonsware.com/Android/) 그는 그 책을 매우 최신으로 유지합니다 (또는 Android Second Edition 잠금 해제를 살펴 본다. 나는 그 책과 관련이 없으며 읽지 않아 추천 할 수 없지만 그렇지 않다. Manning이 작업 중이며 사이트에서 조기 접속할 수 있습니다.)

작성자가 자신의 책 이외의 다른 책을 추천하는 것이 이상하게 보일 수도 있지만 진실은 새로운 API (1.0 레벨에서 작성되었으며 1.5 이후). 저를 잘못 이해하지 마십시오. 그 책은 전반적인 개념 (수명주기, 활동, 의도 등)의 측면에서 여전히 많은 가치가 있습니다 (자랑 스럽습니다). 그러나 얻을 수있는 더 쉽고/더 새로운 방법이 있습니다. 특정 작업이 완료되었습니다.

예를 들어, AsyncTask (http://android-developers.blogspot.com/2009/05/painless-threading.html)를 살펴보면 많은 처리기/메시지 통증을 줄일 수 있습니다.

(내가 여기에 댓글을 달았 것입니다,하지만 난 그것이 담당자 충분히 가지고 있지 관련이있을 수 있습니다 "답"보다는 언급하는 방법을 알아낼 수 없습니다?)

+0

감사 예, 코멘트를 게시하려면 50 명의 담당자가 필요합니다 (그리고 나는 그 임계 값을 맞았 음을 알 수 있습니다 :)). FWIW, 나는 이것이 훌륭한 답변이라고 생각한다. – ZoogieZork

+0

안녕하세요, 귀하의 도서는 훌륭합니다! 나는 많은 다른 안드로이드 서적보다 따르기가 훨씬 쉽다는 것을 알았습니다. 당신이 당신의 코드를 너무 많이 게시하는 것을 꺼리지 않기를 바랍니다! :) 기본적으로 모든 예제를 훑어보고 이해할 수없는 모든 비트를 뚫기 만하면됩니다. – dubbeat

+1

감사합니다. 기꺼이 좋아합니다. 감사합니다. 나는 많은 것들이 핵심/근본적이며 물론 적용된다고 생각한다. (우리는 의도적으로 그렇게 쓰려고 노력했다.) 조금 오래되고 플랫폼이 진화했다는 것을 명심하십시오. 그것은 확실히 이해와 도움이 될 수 있습니다. 예를 들어 프로덕션 코드의 경우, 새로운 구조 (AsyncTask)를 사용합니다. 또한 여기에 포주하지 말고 알려 주시면 업데이트 된 책을 제작 중입니다. 초기 단계이지만 "Android in Practice"가 진행 중입니다. –

관련 문제