2013-03-27 42 views
6

Trong sự phát triển của một ứng dụng Android, tôi đã đi đến một tập hợp các phương pháp kiểu tiện ích mà tôi đã đưa vào một lớp tĩnh. Tất cả các phương pháp này được sử dụng trên nhiều Hoạt động và hầu hết chúng không yêu cầu bất kỳ thông tin nào từ Hoạt động gọi điện.Lớp tiện ích tĩnh với bối cảnh/hoạt động - Android

Tuy nhiên, bây giờ tôi có một số phương pháp yêu cầu Ngữ cảnh hoạt động và một phương thức yêu cầu Bản thân hoạt động. Hãy để tôi minh họa cho một số trong số họ:.

  • getDeviceNaturalOrientation() - Sử dụng một Hoạt động của GetWindow() getWindowManager() getDefaultDisplay() để truy cập màn hình xoay, chiều rộng, và chiều cao để xác định hướng tự nhiên của thiết bị. .
  • getDeviceOrientation() - Tương tự như trên nhưng để có được hiện tại hướng
  • CreateFile() - Sử dụng bối cảnh để truy cập vào một số tài nguyên (chuỗi) và tạo và hiển thị một số nâng cốc chúc mừng

Bây giờ, các câu hỏi lớn của tôi về lớp học Utils này là:

  1. Cho đến nay, mỗi hàm lấy tham số Ngữ cảnh mà tôi chuyển từ bất kỳ Hoạt động nào tôi đang sử dụng, nhưng bạn có thể tạo một bối cảnh tĩnh hoặc biến Hoạt động trong Uti ls lớp và đặt nó ở đầu mỗi Hoạt động (như trong onCreate)? Biến này sẽ được sử dụng trong bất kỳ hàm nào yêu cầu một cá thể Ngữ cảnh hoặc Hoạt động.
  2. Giả sử ở trên không được khuyến nghị, có thể chuyển thông số Hoạt động sang một phương pháp hoặc có lý do để chỉ chuyển một Hoạt động dưới dạng Ngữ cảnh không? Các phương pháp tôi sử dụng cho các chức năng định hướng thiết bị ở trên là dành riêng cho đối tượng Hoạt động, không phải Ngữ cảnh, vì vậy hoặc tôi chuyển qua Hoạt động hoặc chuyển như Ngữ cảnh và truyền vào Hoạt động (âm thanh sau giống như ý tưởng khủng khiếp).

Ngoài ra, tôi rất cởi mở với ý tưởng rằng lớp Util này có thể không phải là cách để thực hiện những phương pháp này. mỗi lớp hoạt động sử dụng chúng.

Trả lời

3

1) Một liên kết tĩnh đến một ngữ cảnh có khả năng gây ra rò rỉ bộ nhớ. Nó có nghĩa là một tham chiếu đến Activity sẽ được giữ xung quanh trong biến tĩnh ngay cả sau khi nó bị phá hủy, vì vậy tất cả bộ nhớ của hoạt động và tất cả các quan điểm của nó sẽ vẫn hợp lệ và không được làm sạch bằng gc. Bạn có thể làm điều này, nhưng bạn phải cẩn thận để vô hiệu hóa biến khi hoàn thành. Nó tốt hơn chỉ để tránh nó.

2) Hơi khó xử khi truyền hoạt động dưới dạng Hoạt động nhưng không có lý do kỹ thuật nào. Tại thời điểm đó chúng tôi đang tranh luận về mã sạch sẽ/bảo trì. Và có những lúc mà giải pháp không sạch sẽ dễ dàng hơn. Tất nhiên trong các trường hợp trên, tôi muốn truyền các đối tượng hướng/hiển thị/Tài nguyên vào hàm hơn là truyền toàn bộ ngữ cảnh hoặc tạo các trình truy cập đặc biệt.

+0

Cảm ơn bạn, tôi đã chấp nhận câu trả lời của bạn. Tôi đã kết thúc việc giữ mọi thứ chủ yếu như chúng, nhưng tôi đã thay đổi một số phương thức để chỉ nhận tài nguyên/FragmentManager/etc ... khi cần thiết thay vì một Ngữ cảnh đầy đủ. Nó thêm vào số lượng các tham số, nhưng tôi đoán ít điều có thể đi sai. Một lần nữa xin cảm ơn. – RobertoCuba

0

Tôi nghĩ rằng thiết kế sau đây nên được tốt khi bạn gọi từ Hoạt động

MyUtility utility=new MyUtility(); 
utility.getDeviceNaturalOrientation(this); 
utility.getFile(this); 

Và bạn có thể xác định các chức năng như

public int getDeviceNaturalOrientation(Activity activity){ 
//code 
return some_oreientation 
} 

và như Hoạt động

public File getFile(Context context){ 
//code 
//return file handler 
} 

đây là lớp con của Ngữ cảnh để bạn thậm chí có thể thay đổi thiết kế theo sau

MyUtility utility=new MyUtility(this); //this refer to Activity 
utility.getDeviceNaturalOrientation(); 
utility.getFile(); 

Chừng nào bạn vượt qua hoạt động bạn cũng tốt nhưng nếu bạn sau đây từ các hoạt động của bạn, bạn sẽ nhận được lỗi từ phương pháp đầu tiên gọi

MyUtility utility=new MyUtility(getApplicationContext()); 
utility.getDeviceNaturalOrientation(); //will throw exception 
utility.getFile(); 

Và, vâng ý tưởng đầu tiên không phải là một cách khuyến khích.

+0

Cảm ơn bạn đã phản hồi. Tuy nhiên, thực sự không có gì để đảm bảo rằng lớp Utility này không tĩnh và được khởi tạo. Ngoài ra, những gì bạn mô tả là khá nhiều những gì tôi đã làm. Điểm cuối cùng của bạn đã mang đến một suy nghĩ khác. Một nửa các ví dụ tôi thấy trực tuyến đối xử với việc truyền Activity và getApplicationContext() như hoán đổi cho nhau. Cho đến nay trong ứng dụng của tôi tôi đã không bao giờ được sử dụng sau này và tất cả mọi thứ là tốt, ngay cả trên các mẫu tôi căn cứ bản thân mình ra nơi họ sử dụng getApplicationContext(). Đó không phải là chỉ khi bạn tạo một lớp Ứng dụng? – RobertoCuba

+0

Ngữ cảnh ứng dụng đính kèm với vòng đời ứng dụng và ngữ cảnh Hoạt động với Vòng đời hoạt động. Vì vậy, bạn không phải là giả sử để tạo ra một hộp thoại với bối cảnh ứng dụng và bạn giả sử để làm điều đó với bối cảnh hoạt động. – minhaz

0

tôi sẽ đề nghị bạn gửi một WeakReference of your Activity hoặc getApplicationContext() (đối với những công trình mà có thể làm việc sử dụng nó) và không sử dụng static methodnó gây ra rò rỉ bộ nhớ. Read Developer blog cũng

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