2012-03-13 29 views
7

Tôi có rất nhiều nút trong Hoạt động của tôi, tôi có câu hỏi sau:Chúng tôi có nên sử dụng các lớp ẩn danh cho OnClickListeners hoặc các lớp được đặt tên bên trong không?

  1. Tôi có nên tạo nhiều lớp vô danh bên trong cho OnClickListeners cho mỗi nút, như dưới đây:

    private View.OnClickListener mShuffleListener = new View.OnClickListener() { 
        public void onClick(View v) { 
         /// task to do 
        } 
    }; 
    
  2. Hoặc nên Tôi đi cho một lớp bên trong được đặt tên và thêm một điều kiện nếu để kiểm tra trình nghe click nào được gọi.

Điều nào tốt hơn để tiết kiệm tài nguyên bộ nhớ?

+1

Bất cứ điều gì phù hợp với bạn !! ... Tôi sẽ đề xuất cho một lớp bên trong có tên, nếu bạn muốn có một mã có cấu trúc ... –

Trả lời

7

Làm cách nào để tiết kiệm tài nguyên mem?

Nó sẽ tạo ra hầu như không có bất kỳ sự khác biệt nào. Tối đa 1 từ ... và đó là so sánh một lớp bên trong tĩnh với một lớp ẩn danh (không tĩnh). Khoản tiết kiệm nhỏ như vậy không đáng để bạn có thể đọc mã/khả năng bảo trì mã, ngay cả (IMO) nếu bạn có một số hàng trăm của các nút này.

+0

Tôi có gần 15 nút trong một hoạt động ,, nếu xác định 15 lớp ẩn danh, nó sẽ mất 15 * 8 byte bộ nhớ để tham khảo, nếu tôi đi cho lớp bên trong có tên và triển khai cliklistener, nó sẽ tiết kiệm gần 14 * 8 byte .. Nói? – AAnkit

+3

1) Chỉ khi chúng là 'tĩnh'. Nếu không, không có tiết kiệm. 2) Có thể là 14 * 4 byte. Và đó là một lượng nhỏ bộ nhớ đáng lo ngại. 3) Nếu bạn có một nền tảng Android 64 bit và do đó tham chiếu 8 byte, điều này thậm chí còn vô lý hơn. –

1

Tôi thường thích một cách tiếp cận tinh tế hơn mà làm cho mã dễ đọc hơn khi sử dụng onClick nghe

Có một tính chất gọi là onClick cho hầu hết các vật dụng trong menu thuộc tính (cũng có sẵn trong xml bố trí), có bạn có thể viết một tên phương pháp Ex xyz

bây giờ đi đến file nguồn java của bạn đó bạn chỉ cần viết một phương pháp Ex

public void xyz(View v) 
{ 
//your code goes here 
} 

và bạn đã làm xong .Also nếu bạn thực sự muốn sử dụng CLA nội sses sau đó đi với những người vô danh nếu bộ nhớ là bạn quan tâm (mỗi tài liệu tham khảo được lưu trữ mất 8 byte bộ nhớ trong java nếu một loại tài liệu tham khảo của nó mà trong trường hợp này nó được).

hy vọng điều này sẽ giúp .. hãy hỏi xem bạn có cần giải thích rõ hơn

+0

Giả sử tôi có 10 nút, nếu tôi tạo 10 lớp ẩn danh cho mỗi người nghe, nó sẽ tạo ra 10 đối tượng mới do đó 10 * 8 byte, nhưng nếu tôi đi với lớp bên trong có tên và đã kiểm tra tất cả 10 nút để xem cái nào được nhấp, tôi có thể lưu 9 * 8 byte. ?? những gì bạn nói về điều này – AAnkit

+0

yup của nó đúng để lưu trữ các tài liệu tham khảo trong biến khác bởi vì sau khi bạn lưu trữ tài liệu tham khảo của các đối tượng và những tài liệu tham khảo phải được lưu trữ ở đâu đó.Nhưng cho các đối tượng (10 * 8 là một giả định sai) hãy chắc chắn bao nhiêu bộ nhớ nó sẽ mất vì nó lại có thể chứa các tham chiếu khác bên trong chính nó cộng với các kiểu nguyên thủy. Một đối tượng có thể chứa các đối tượng khác nữa. – Nav

1

Có ba cách để xử lý sự kiện. Hãy có một cái nhìn vào liên kết sau

http://tseng-blog.nge-web.net/blog/2009/02/14/implementing-listeners-in-your-android-java-application/

Xem phần sau đây để biết việc sử dụng các lớp ẩn danh và lớp bên trong

nặc danh lớp

Sử dụng lớp bên trong vô danh nếu bạn muốn mã không được sử dụng ở bất kỳ nơi nào khác (lớp này đang được sử dụng ngay tại đây và không có nơi nào khác.)

lớp bên

mã lớp bên trong có thể được sử dụng (nếu chỉ bởi lớp đã tạo ra nó nếu làm tư nhân). Nếu bạn thấy một lớp bên trong có tên, ai đó có thể nghĩ rằng nó sẽ được sử dụng ở nhiều nơi trong lớp.

+0

Giả sử tôi có 10 nút, nếu tôi tạo 10 lớp ẩn danh cho mỗi người nghe, nó sẽ tạo 10 đối tượng mới do đó 10 * 8 byte, nhưng nếu tôi đi với lớp bên trong có tên và kiểm tra tất cả 10 nút để xem cái nào nhấp vào, tôi có thể lưu 9 * 8 byte. ?? những gì bạn nói về điều này – AAnkit

+0

@Ankit Trong trường hợp này tại sao bạn không sử dụng thực hiện từ khóa. Bạn nói gì về điều này? –

+0

@Ankit. Đọc câu trả lời đã chỉnh sửa của tôi. –

1

Nếu tất cả các nút có chức năng tương tự chỉ khác nhau trong thông số có thể nhận dạng được, tốt hơn nên tạo một người nghe và gán nó cho tất cả các nút.

Vị trí của người nghe phụ thuộc vào phạm vi biến mà nó cần sử dụng. Nếu nó cần sử dụng một số biến phương thức, nó phải được tạo bên trong phương thức, nếu nó sử dụng một thành viên lớp, nó sẽ được tạo bên trong lớp đó.

Ví dụ, nếu bạn có mười nút mà mỗi nên bắt đầu một hoạt động khác nhau, bạn có thể tạo bản đồ về quan điểm và hoạt động, và trong người nghe tài trợ cho các hoạt động thích hợp để bắt đầu:

Map<View, Class<?>> viewActivityMap = new HashMap<View, Class<?>>(); 
// fill it somewhere 

// in onCreate 
View.OnClickListener listener = new View.OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     Class<?> classToStart = viewActivityMap.get(v); 
     Intent intent = new Intent(YourActivity.this, classToStart); 
     startActivity(intent); 
    } 
} 

button1.setOnClickListener(listener); 
button2.setOnClickListener(listener); 
button3.setOnClickListener(listener); 

Trong trường hợp của người nghe, lý do thực sự duy nhất tôi thấy để tạo ra một lớp bên trong, là nếu bạn muốn tạo một hàm tạo nhận các tham số khác với các hàm tạo lớp/giao diện được triển khai thực hiện.

+0

Tôi phải gọi một số phương pháp khi nhấp vào nút, Tôi đang nghĩ đến việc có một lớp bên trong có tên là ClickListener và nếu có điều kiện khác sẽ kiểm tra nút nào được nhấp. hoặc tôi nên đi để tạo người nghe bằng cách tạo các lớp nội dung bên trong cho mỗi nút. – AAnkit

+0

Nếu chức năng là khác nhau, tôi sẽ tạo các trình lắng nghe riêng biệt với mỗi người thực hiện, nếu chức năng có phần tương tự, tôi sẽ sử dụng cùng một chức năng. – MByD

+0

Cảm ơn vì điều này, như tôi có thể thấy trong nguồn Android họ cũng tạo ra những người nghe khác nhau cho các nút khác nhau. – AAnkit

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