7

Sau khi đọc bài viết Avoiding memory leaks bởi @RomainGuy tôi nhận ra rằng ứng dụng Android hiện tại của tôi bị cản trở với sai lầm khi truyền hoạt động chính của ứng dụng xung quanh. Vì vậy, bất cứ khi nào tôi, tôi chỉ có thể thay thế thông số hoạt động đó bằng Activity.getApplicationContext().Mẫu lệnh để chuyển các phương thức hoạt động của ứng dụng?

Nhưng có một số lớp nhất định trong ứng dụng của tôi vẫn cần chạy các phương thức chỉ có thể là thành viên của hoạt động chính của ứng dụng.

Vì vậy, tôi đã nghĩ đến việc có thể sử dụng Command Pattern để giải quyết vấn đề này.

Vấn đề là, nếu chúng ta nhìn vào ví dụ:

public class SomeCommandExecuableOnlyByActivity implements Command 
{ 
    public void execute(Object data) 
    { 
     doIt(((MyActivity)data).getWindow()); 
    }  
} 

Tôi chạy lại vào ngõ cụt của cần đèo quanh hoạt động (lần này cải trang thành Object dữ liệu).

Làm cách nào để thoát khỏi tình trạng "gà & trứng" này?

Có cách nào tốt hơn để tiếp cận vấn đề này không?

+6

Không có gì trong bài viết đó tuyên bố rằng "chuyển hoạt động chính của ứng dụng xung quanh" là một sai lầm. Đặt nó trong các thành viên dữ liệu tĩnh * là * một sai lầm, và đó là vấn đề cốt lõi đằng sau viên đạn đầu tiên và thứ ba của anh ta ở cuối bài viết. IMHO, chỉ sử dụng 'Ứng dụng' khi bạn biết cụ thể và chính xác tại sao bạn đang sử dụng nó. Nó không phải là một thay thế chăn cho 'Hoạt động', đặc biệt là cho công việc giao diện người dùng. – CommonsWare

+2

@CommonsWare Cảm ơn bạn đã chỉ ra sự khác biệt đáng kể này. Trong trường hợp của tôi, tôi giữ một thành viên dữ liệu SharedPreferences tĩnh trong Hoạt động chính của mình để dễ dàng truy cập bởi các mô-đun khác nhau trong ứng dụng. Vì vậy, tôi có thể truy cập các tùy chọn được chia sẻ bằng cách tránh truyền Hoạt động chính dưới dạng tham số: 'MainActivity.staticPrefs'. Đây có phải là "* Đưa nó vào các thành viên dữ liệu tĩnh *"? – ih8ie8

+1

Đó là một câu hỏi hay. Vì 'SharedPreferences' là một giao diện, và tôi không dễ dàng thấy nơi triển khai cụ thể là gì, tôi không biết. Nếu 'SharedPreferences' không giữ một' Context' - và nó có thể - thì bạn sẽ cần sử dụng 'Application' hoặc tránh thành viên dữ liệu tĩnh. Tôi mong đợi 'Application' hoạt động tốt với' SharedPreferences'. – CommonsWare

Trả lời

3

Tôi nghĩ rằng những gì bạn có thể bị thiếu ở đây là sự phân tách mối quan tâm thích hợp. Nếu bạn nói rằng bạn phải vượt qua hoạt động chính của bạn xung quanh với các hoạt động khác để gọi một số chức năng trên nó, sau đó có vẻ như tôi kiến ​​trúc của ứng dụng của bạn có một số sai sót thiết kế cơ bản. Có hoặc không sử dụng mẫu lệnh ở đây tôi không thể nói, nhưng những gì tôi thường làm là xác định những phương thức yêu cầu quyền truy cập chia sẻ, chuyển chúng sang một lớp riêng biệt và sau đó giữ một thể hiện riêng biệt của lớp đó trong tất cả các hoạt động yêu cầu chức năng này, hoặc nếu bạn cần chia sẻ trạng thái cá thể, hãy tạo nó trong ngữ cảnh ứng dụng toàn cầu và cung cấp đường dẫn truy cập toàn cầu tới nó (không mong muốn, nhưng không có khung DI như RoboGuice, rất khó triển khai DI trên Android, kể từ khi các nhà thầu xây dựng bị hủy.)

Theo ý kiến ​​của tôi, trong một ứng dụng Android được thiết kế tốt, Hoạt động không có logic nghiệp vụ và chỉ cung cấp các hoạt động thay đổi trạng thái giao diện người dùng. Dòng chảy của giao diện người dùng hoặc bất kỳ tính toán nào khác sẽ được để lại cho các lớp khác. Các Model-View-Presenter pattern giúp rất nhiều ở đây để giữ cho mã của bạn được cấu trúc bởi trách nhiệm.

Không cho chúng tôi hiểu rõ hơn về những gì bạn đang cố gắng đạt được, thật khó để đưa ra lời khuyên cụ thể.

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