2012-03-17 30 views
8

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

10
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.

+0

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

+0

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

1

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. 
+0

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

+0

để bạn phải xóa thủ công. trong onDestroy() của hoạt động staticvariable = ""/null; –

4

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().

0

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.

+0

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

0

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.

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