2012-11-08 31 views
13

Một nơi nào đó trong ứng dụng, tôi cần lấy một chuỗi được bản địa hóa bằng phương thức getString cho một thông báo lỗi. Đối với điều này, tôi cần một trường hợp bối cảnh, nhận được từ ví dụ một hoạt động. Đây có thực sự là cách thiết kế này không? Tôi thực sự buộc phải vượt qua các đối tượng này vào các lớp học và phương pháp hoặc tôi thiếu điểm và có cách nào khác để có được một tham chiếu chuỗi?Tôi có thực sự cần phải vượt qua các trường hợp bối cảnh sâu vào ứng dụng không?

Để làm rõ, trong một Hoạt động, tôi có lớp con AsyncTask bên trong trong doInBackground tạo một lớp mới cho một số xử lý mạng ngắn bên ngoài chuỗi giao diện người dùng. Tôi muốn các thông báo lỗi được bản địa hóa và cho rằng tôi cần phải vượt qua trong một trường hợp bối cảnh (nói cách khác, hoạt động) vào lớp đó. Thiết kế của việc nhận các tài nguyên giá trị từ các tệp XML dường như hơi khó hiểu một chút. Nó khiến tôi băn khoăn tại sao điều này lại kết hợp với các bối cảnh Context và không phải thứ gì đó tĩnh hoặc - tha thứ cho tôi - một singleton, như Context ngụ ý là bối cảnh ứng dụng toàn cầu chứ không chỉ là một phần của nó như một Activity.

+2

Điều này có xảy ra trong lớp tiện ích hay gì đó không? Bạn cần ngữ cảnh cho 'getString()', vì vậy câu trả lời ngắn gọn là có. Nếu bạn cung cấp thêm chi tiết về vị trí/cách bạn cần gọi, thì có thể có một cách * tốt hơn * truyền/giữ tham số phương thức. –

Trả lời

7

Không, bạn không nên làm điều này. Một quy tắc đơn giản là; nếu những gì bạn cần bối cảnh là chạm vào giao diện người dùng hoặc chỉ được liên kết với nội bộ của lớp hoạt động, thì bạn nên sử dụng ngữ cảnh hoạt động. Thậm chí sau đó, điều quan trọng là bất kỳ tham chiếu nào đến ngữ cảnh không có thời gian hoạt động lâu hơn so với hoạt động.

Nguy cơ lớn không tuân theo điều này là bạn đưa ra một tham chiếu đến bối cảnh hoạt động ở đâu đó sâu hơn trong mã của bạn và hoạt động của bạn bị hủy trong khi tham chiếu bạn đang nắm giữ vẫn còn trong phạm vi. Bạn vừa tiết lộ hoạt động của mình và mọi thứ có liên quan đến nó. Tôi khuyên bạn không nên vượt qua bối cảnh hoạt động bên ngoài hoạt động trừ khi thực sự cần thiết và thậm chí sau đó, rất chắc chắn để kiểm soát thời gian cuộc sống đó.

Vì vậy, bối cảnh là cần thiết cho một thứ không liên quan đến giao diện người dùng, chẳng hạn như nhu cầu của bạn để lấy tài nguyên chuỗi, sau đó sử dụng ngữ cảnh ứng dụng. Bên trong một hoạt động, và nơi tham chiếu chuỗi được khai báo trong hoạt động, sau đó sử dụng bối cảnh hoạt động sẽ được chấp nhận và theo ý kiến ​​của tôi, ưa thích khi bạn đưa ra quyết định có ý thức về phạm vi và thời gian sống.

Điều đó nói rằng, bạn nên hỏi liệu phương pháp cụ thể này có được đặt tốt hơn trong hoạt động hay không. Nó có thể không được nhưng hãy tự hỏi.

Cuối cùng, một điểm nhỏ. Bạn không vượt qua các đối tượng ở bất cứ đâu. Bạn vượt qua một tham chiếu, trên thực tế là một giá trị của một tham chiếu đến đối tượng. Mọi thứ trong Java được truyền theo giá trị.

+1

Tôi không cần đối tượng Context cho các nhiệm vụ liên quan đến giao diện người dùng, chỉ dành cho getString để làm cho Ứng dụng có sẵn thông qua một cái gì đó giống như một lớp Nhà nước thay vào đó dường như là cách để đi. Tất cả sự ghét đối với trạng thái có sẵn trên toàn cầu (tức là người độc thân) chỉ cho tôi theo một hướng xấu xí hơn - đi qua các tham chiếu. Và vâng, tôi biết rằng trong Java bạn truyền xung quanh các bản sao tham chiếu đến các đối tượng thay vì sao chép sâu chúng. – dodehoekspiegel

+1

Chỉ cần sử dụng getApplicationContext(), Xem phần này để có một cuộc thảo luận tuyệt vời về ngữ cảnh ứng dụng. http://stackoverflow.com/questions/5018545/getapplication-vs-getapplicationcontext BTW, ứng dụng của bạn là một singleton để người ghét có thể ghét tất cả những gì họ thích nhưng mọi thứ họ làm phụ thuộc vào singletons :) Có, rất nhiều cách để lạm dụng nhưng sử dụng ngữ cảnh ứng dụng không phải là một trong số chúng và vì nó là một singleton, trạng thái không đi vào nó. Trạng thái ứng dụng IS của bạn. – Simon

0

Bạn luôn có thể mở rộng lớp ứng dụng. Tạo một phương thức tĩnh trên đó cho getInstace() để lấy bối cảnh.

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