2010-05-25 55 views
6

Tôi chỉ mới bắt đầu trên android và java của tôi là verry gỉ. Tôi không thể nhớ bao giờ nhìn thấy một chức năng lồng nhau trong một chức năng như thế này trước đây. Ai đó có thể giải thích cho tôi chính xác những gì cuối cùng và giải thích lý do tại sao bạn sẽ tổ chức một chức năng khác như thế này?Ai đó có thể Giải thích mã java này

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); 
      } 
     } 
    }; 

Trả lời

27
  • Đây là một Anonymous Class. Điều thực sự xảy ra là lớp con của Handler đang được được tạo với chức năng bị ghi đè handleMessage.

    Một trong những điều tao nhã nhất về lớp nặc danh là họ cho phép bạn định nghĩa một lớp one-shot chính xác nơi nó là cần thiết. Ngoài ra, các lớp ẩn danh có cú pháp ngắn gọn làm giảm sự lộn xộn trong mã của bạn.

  • Bạn cũng hỏi "ai đó thể giải thích cho tôi chính xác những gì final làm". Một lời giải thích tốt đẹp can be found here.

    Trong trường hợp ví dụ của bạn, từ khóa final ngăn không cho ai có thể gán một thể hiện mới/null đối tượng biến "xử lý" nghĩa là tôi không thể viết dòng handler = null; hoặc handler = new Handler() { ... } sau đoạn mã ví dụ của bạn.

+0

thats lớn, nhiều đánh giá cao – dubbeat

3

Đây được gọi là lớp ẩn danh. Giải thích chi tiết có sẵn tại đây .... (link)

2

Mã này tạo một thể hiện của trình xử lý lớp và đồng thời ghi đè phương thức "handleMessage" của Trình xử lý.

2

Đây là lớp ẩn danh (a) triển khai giao diện Trình xử lý hoặc (b) mở rộng lớp Trình xử lý.

8

Dường như tôi đã viết mã Java đó); Đó là một trong những ví dụ của tôi trong cuốn sách Manning Mở khóa Android - http://code.google.com/p/unlocking-android/. Trong khi mục đích của cuốn sách không phải là để trang trải chi tiết về Java, và thay vì tập trung vào Android, tôi xin lỗi nếu nó gây ra sự nhầm lẫn.

Câu trả lời ở đây là tại chỗ, đó là cố ý một lớp bên trong anon bởi vì nó không được sử dụng bất cứ nơi nào khác ngoài ngữ cảnh đó.

Một lưu ý rằng tôi sẽ thêm mặc dù, nếu bạn chỉ mới bắt đầu với Android, tôi sẽ đi với một cuốn sách mới hơn. Cuốn sách CommonsWare của Mark Murphy khá tốt (http://commonsware.com/Android/) và anh ấy giữ chúng rất cập nhật (hoặc có thể nhìn vào phiên bản Mở khóa thứ hai của Android, tôi không tham gia vào đó, và chưa đọc nó nên không thể đề xuất hay không, nhưng Manning đang làm việc trên nó và nó có sẵn như là truy cập sớm tại trang web của họ). Có thể có một số cách tốt hơn để thực hiện công cụ đó ngay bây giờ trên các API mới hơn (được viết ở mức 1.0 và được thử nghiệm trên đó). 1,5 sau khi thực tế). Đừng hiểu lầm tôi, cuốn sách đó vẫn có nhiều giá trị (mà tôi tự hào) về khái niệm tổng thể (vòng đời, hoạt động, ý định, vv), nhưng có những cách tốt hơn/dễ hơn/mới hơn để có được một số nhiệm vụ cụ thể được thực hiện.

Ví dụ, hãy xem AsyncTask (http://android-developers.blogspot.com/2009/05/painless-threading.html) và nó sẽ giúp bạn tiết kiệm rất nhiều lỗi về xử lý/tin nhắn.

(tôi đã có nhận xét ở đây, nhưng tôi không thể tìm ra cách để bình luận chứ không phải là "câu trả lời", nó có thể liên quan đến việc không có đủ của một đại diện?)

kẻ
+0

Đúng, bạn cần 50 đại diện để đăng nhận xét (và tôi thấy rằng bạn chỉ cần nhấn ngưỡng đó :)). FWIW, tôi nghĩ rằng đây là một câu trả lời tốt. – ZoogieZork

+0

Xin chào, Sách của bạn thật tuyệt vời! Tôi tìm thấy nó dễ dàng hơn để làm theo hơn rất nhiều các cuốn sách Android khác. Hy vọng bạn không nhớ tôi đăng mã của bạn quá nhiều! :) Im về cơ bản chỉ cần đi qua tất cả các ví dụ và disecting tất cả các bit tôi không hiểu – dubbeat

+1

Tôi không nhớ ở tất cả, vui mừng bạn thích nó, và cảm ơn! Tôi nghĩ rằng rất nhiều thứ trong đó là cốt lõi/cơ bản và tất nhiên vẫn áp dụng (chúng tôi cố gắng viết nó theo cách cố ý). Chỉ cần ghi nhớ khi sử dụng nó mà nó lớn hơn một chút và nền tảng đã phát triển. Nó chắc chắn có thể giúp với sự hiểu biết và như vậy, nhưng đối với mã sản xuất ví dụ, tôi muốn đi với các cấu trúc mới hơn (trong trường hợp đó, AsyncTask). Ngoài ra, không phải để pimp nó ở đây, nhưng chỉ để cho bạn biết, tôi đang làm việc trên một cuốn sách cập nhật. Giai đoạn đầu, nhưng "Android in Practice" đang được tiến hành. –

Các vấn đề liên quan