Trong ứng dụng của tôi có một lớp mà tôi đã khai báo một số biến số static
. Vấn đề là giá trị cho tất cả các biến không được đặt lại khi ứng dụng bị hủy.
Có cách nào để đặt lại giá trị của tất cả các biến tĩnh khi ứng dụng bị hủy, ngoại trừ việc đặt lại chúng riêng lẻ trong onDestroy()
?Xóa dữ liệu tĩnh trênDestroy()
Trả lời
class MySettings {
// final can't be changed
public static final String CONSTANT = "ucantchangeme";
// static - all Objects have just these - even different Acitivities etc
public static String sUserName;
// class instance members - each Object you create with new has its own version
public String mUserName;
public MySettings() {
mUserName = "uninitialized";
}
public static void init() {
sUserName = "Peter";
}
public static void reset() {
sUserName = null;
}
}
/* Your Activity */
class MyActivity extends Actitivy {
private MySettings mSettings;
private MySettings mOtherSettings;
onCreate() {
// init those static parts of MySettings
MySettings.init();
mSettings = new mSettings();
mSettings.mUserName = "Peter"
Log.d("TAG", "Username: " + mSettings.mUserName);
// prints Peter
// this could also be another Activity
mOtherSettings = new MySettings();
Log.d("TAG", "Username: " + mOtherSettings.mUserName);
// prints "uninitialized"
MySettings.sUserName = "Jim";
Log.d("TAG", "Username: " + MySettings.sUserName);
// prints "Jim"
mSettings.sUserName = "Joe";
Log.d("TAG", "Username: " + MySettings.sUserName);
Log.d("TAG", "Username: " + mSettings.sUserName);
Log.d("TAG", "Username: " + mOtherSettings.sUserName);
// all print "Joe" now
}
onDestroy() {
// clear MySettings
MySettings.reset();
}
}
Bạn có thể thiết lập lại các biến tĩnh để null
hoặc bất kỳ giá trị mà bạn muốn nhưng sử dụng các biến tĩnh cho những thứ khác sau đó hằng số thường là một ý tưởng tồi - đó là thiết kế lớp thường xấu và có thể dẫn đến hành vi bất ngờ như một trong những bạn quan sát .
Giá trị của các biến tĩnh sẽ kéo dài chừng nào lớp được nạp - nó đã gần như không có gì để làm với vòng đời hoạt động (onCreate
..., onDestroy
)
Lần đầu tiên bạn truy cập vào một lớp từ mã nó sẽ được tải và sau đó nó sẽ không biến mất cho đến khi có một lý do để dỡ bỏ nó. Trong thời gian đó bất cứ điều gì từ bên trong ứng dụng của bạn (về mặt kỹ thuật trong cùng một quy trình - thường mỗi .apk sử dụng riêng của nó) sẽ đọc cùng một giá trị từ các thống kê đó.Và nếu bạn thay đổi nó từ những nơi khác nhau bạn thay đổi nó cho các phần khác mà không biết về sự thay đổi - đó là lý do tại sao nó xấu :)
Lý do duy nhất (tôi biết) rằng Android sẽ dỡ bỏ một lớp là của bạn ứng dụng bị xóa hoàn toàn khỏi bộ nhớ - thông qua công cụ giết người hoặc khi ứng dụng của bạn không còn hoạt động và bộ nhớ bị chậm. Điều đó hoàn toàn nằm ngoài tầm kiểm soát của bạn và không nên xảy ra trong khi ứng dụng của bạn được sử dụng. Điều đó có thể xảy ra nếu ví dụ: một cuộc gọi điện thoại đến và ứng dụng của bạn sẽ tiếp tục sau.
Không thể, biến tĩnh của bạn phải rõ ràng khi hoạt động của bạn bị phá hủy. Có thể biến tĩnh của bạn được khai báo trong một số hoạt động khác và bạn phá hủy hoạt động khác.
Activity loses almost all the references once get destroyed.
Các biến được khai báo trong một lớp riêng biệt, không phải là một hoạt động. Chúng được khởi tạo khi Activity đầu tiên được khởi chạy. Nhưng khi tôi hoàn thành ứng dụng và kiểm tra các giá trị, chúng vẫn giữ nguyên giá trị đó. – noob
để bạn phải xóa thủ công. trong onDestroy() của hoạt động staticvariable = ""/null; –
Trong onDestroy()
bạn có thể đặt rỗng giá trị cho những static variables
..
EDIT:
Static variables
được tạo ra và khởi tạo khi lớp chứa chúng được nạp vào máy ảo bằng cách trình nạp lớp. Khi lớp học là chưa được tải hoặc máy ảo kết thúc, các biến tĩnh sẽ "poof". Có thường không cần phải xóa chúng.
Tôi cho rằng nếu bạn muốn bạn có thể xóa chúng trong một onTerminate() phương pháp (trong ứng dụng) hoặc một onDestroy()
phương pháp (trong một hoạt động), nhưng không có nhiều điểm khi làm như vậy, và có không bảo đảm rằng một trong hai phương pháp đó sẽ được gọi.
Nếu bạn vì một số lý do hoang tưởng về các biến không bị xóa khi được tạo (vi phạm nghiêm trọng "hợp đồng" của VM), bạn có thể xóa chúng theo phương thức onCreate()
.
Khi sao hoạt động của bạn kiểm tra biến của bạn.Khi hoạt động phá hủy, tất cả biến được khởi tạo lại. Kiểm tra giá trị biến của bạn. Không thể khi hoạt động phá hủy giá trị biến của bạn giống nhau. Kiểm tra điều đó khi giá trị biến của bạn khi được khởi tạo.
HOẶC Biến được khởi tạo lại trên phương pháp hủy. Biến tĩnh = "" hoặc biến tĩnh = null.
Biến tĩnh không được khởi tạo cho mỗi cá thể khôn ngoan. Chúng liên kết với lớp không phải với cá thể. – Praveen
Nếu bạn đặt lại biến tĩnh của mình trênTạo chúng không còn tĩnh nữa và bạn cũng có thể sử dụng biến không tĩnh.
Trong thực tế, bạn có nhiều khả năng làm tốt hơn vì thiếu sự đồng bộ giữa hành vi biến tĩnh được chỉ định và vòng đời ứng dụng của Android.
- 1. maps - xóa dữ liệu
- 2. Xóa đường xóa có chứa dữ liệu
- 3. Xóa dữ liệu iCloud không xóa NSUbiquitousKeyValueStore?
- 4. Xóa dữ liệu cục bộStorage
- 5. Dữ liệu jQuery - Xóa nhãn
- 6. Xóa dữ liệu khỏi RRDTool
- 7. Yêu cầu dữ liệu tĩnh trong ASP.NET
- 8. C chức năng # với dữ liệu tĩnh
- 9. Xóa cơ sở dữ liệu khi Tài khoản bị xóa
- 10. HTML5 - localStorage xóa và xóa tất cả dữ liệu
- 11. NSKeyedUnarchiver - xóa dữ liệu được giải mã?
- 12. Xóa dữ liệu khỏi tệp HDF5
- 13. Xóa cơ sở dữ liệu từ C#
- 14. "Xóa dữ liệu người dùng" android
- 15. Xóa đối tượng trong Dữ liệu chính
- 16. netbeans IDE: cách xóa nguồn dữ liệu
- 17. Lưu trữ dữ liệu tĩnh trong một mảng hoặc trong một cơ sở dữ liệu?
- 18. Sử dụng biến tĩnh cho dữ liệu bộ nhớ cache
- 19. Set dữ liệu cho các tế bào UITableView tĩnh
- 20. không tĩnh thành viên dữ liệu initializers câu hỏi
- 21. Bao gồm dữ liệu tĩnh trong setup.py (setuptools)
- 22. khởi In-lớp của các thành viên dữ liệu tĩnh
- 23. DLL và STL và dữ liệu tĩnh (oh my!)
- 24. Hoạt động Android trênDestroy() được gọi trên khóa màn hình
- 25. Tĩnh khẳng định để kiểm tra các thành viên dữ liệu lớp const tĩnh?
- 26. Tránh xóa dữ liệu khỏi cơ sở dữ liệu khi nhấp vào nút 'xóa dữ liệu' trong cài đặt ứng dụng trên thiết bị Android
- 27. Xóa (hợp nhất) tệp dữ liệu thứ cấp của cơ sở dữ liệu SQL Server
- 28. RestKit xóa dữ liệu cũ khỏi dữ liệu lõi bằng cách sử dụng setObjectMapping
- 29. Di chuyển dữ liệu lõi: Cách xóa ngăn xếp Dữ liệu cốt lõi?
- 30. Vô tình xóa tất cả dữ liệu trong cơ sở dữ liệu 'chủ'
Chính xác như tôi đang làm ngay bây giờ, nhưng có rất nhiều biến tĩnh, cần phải được đặt lại, vì vậy tôi đã suy nghĩ nếu có cách nào tốt hơn hoặc sạch hơn để thực hiện việc này. – noob
Nó chỉ hoạt động nếu bạn làm theo cách thủ công như trong 'reset()'. Nếu bạn có nhiều người trong số họ có thể bạn có thể làm điều đó với [phản ánh] (http://java.sun.com/developer/technicalArticles/ALT/Reflection/) trong một vòng lặp trên tất cả các lĩnh vực nhưng tôi sẽ không làm điều đó. – zapl