2013-07-27 35 views
17

khi tôi khai báo và khởi tạo biến là tĩnh trong hoạt động chính của mình và hoạt động bị hủy. Tôi vẫn có thể truy cập nội dung của biến không?Tuổi thọ của biến tĩnh trong Android

Ví dụ để luôn truy cập AsyncTask mà tôi lưu vào biến này? Điều tôi muốn là có thể truy cập vào nó sau một thay đổi định hướng.

+0

Tôi gặp phải các vấn đề lớn vì các biến tĩnh. Việc dọn sạch bộ nhớ là không thể đoán trước và có thể dẫn đến thất bại không mong muốn. Bạn có thể làm sạch bộ nhớ bằng cách xóa bộ nhớ RAM (giữ nút home để đến đó). Nếu ứng dụng của bạn vẫn hoạt động, bạn nên an toàn ;-) –

Trả lời

11

Biến tĩnh được liên kết với một lớp và chúng sẽ tồn tại miễn là lớp đó nằm trong bộ nhớ và hủy khi lớp được tải (rất hiếm khi xảy ra).

Trong Android, bạn đã thấy rằng khi chúng ta đóng bất kỳ ứng dụng nào nó không đóng hoàn toàn, nó vẫn còn trong ngăn xếp ứng dụng gần đây, bạn có thể thấy bằng cách giữ nút Home (Trên hầu hết các thiết bị).

Android bản thân đuổi ra khỏi những ứng dụng gần đây khi các ứng dụng khác cần nhớ

+0

bằng chứng, liên kết? lý do khiến lớp học và trình tải lớp của anh ấy không thể tải xuống khỏi bộ nhớ, trong khi ứng dụng tiếp tục chạy? – kreker

2

Nếu quá trình bị hủy thì tất cả các biến tĩnh sẽ được khởi động lại thành giá trị mặc định của chúng.

Điều này chủ yếu là do khi bạn khởi động lại ứng dụng, một phiên bản mới được tạo và biến tĩnh sẽ được khởi động lại.

+0

Điều đó có nghĩa là, nếu chế độ khởi chạy của hoạt động là singleInstance, ví dụ, nó sẽ ở đó cho đến khi thiết bị được khởi động lại, phải không? –

+0

không. nhấn nút home. mở ddms và giết quá trình. quay lại ứng dụng. đây là một cách đơn giản để tái tạo lại những gì hệ điều hành sẽ làm ngẫu nhiên cho ứng dụng của bạn khi nó cảm thấy như nó, và bạn sẽ thấy rằng các biến tĩnh của bạn đã biến mất – dabluck

4

Tôi vẫn có thể truy cập nội dung của biến không?

Giả sử rằng bằng "bị hủy", bạn có ý nghĩa giống như người dùng nhấn BACK, có.

Thành viên dữ liệu tĩnh tồn tại trong suốt quá trình xử lý.

Ví dụ để luôn truy cập AsyncTask mà tôi lưu vào biến này? Những gì tôi muốn là để có thể truy cập vào nó cũng sau một sự thay đổi định hướng.

Đó không phải là giải pháp thích hợp. Sử dụng đoạn được giữ lại hoặc use onRetainNonConfigurationInstance().

+0

'' 'onRetainNonConfigurationInstance()' '' là cuối cùng trong khung hỗ trợ để không hoạt động. – maysi

+1

@Simon: Sau đó, sử dụng một đoạn được giữ lại (tức là, một mảnh, mà bạn đã gọi là 'setRetainInstance (true)', quản lý 'AsyncTask'). Xem https://github.com/commonsguy/cw-omnibus/tree/master/Threads/AsyncTask – CommonsWare

+0

hm Tôi vẫn không thực sự hiểu cách tiếp tục. Tôi có một avtivity chính mà là một '' 'SherlockFragmentActivity''' và nó có một phương pháp làm mới. Trong phương thức này, một đối tượng mới của 'AsyncTask''' của tôi được tạo và thực thi. Khi Task khởi động ('' 'onPreExecute()' '') một '' 'Dialog''' được tạo và thông điệp của hộp thoại được thay đổi 3 lần trong' '' doInBackground() '' 'và trong' '' onPostExecute() '' 'hộp thoại bị loại bỏ. Nhưng khi định hướng được thay đổi có một số vấn đề. ví dụ. không có hộp thoại nào nữa. vậy tôi nên tiếp tục như thế nào? Tôi có nên tạo một qustion mới, nơi tôi giải thích chi tiết này không? – maysi

0

Android có khái niệm về empty process mà nói ứng dụng của bạn có thể không được loại bỏ khỏi bộ nhớ nếu nó thường xuyên được sử dụng bởi người dùng ngay cả khi tất cả các thành phần của nó đều bị hủy (hoạt động, dịch vụ và/hoặc bộ thu phát sóng), trong trường hợp biến số tĩnh sẽ không bị xóa hoàn toàn .

Lớp ứng dụng là cách tốt nhất để chia sẻ một số biến tạm thời giữa các thành phần vì lớp ứng dụng sẽ được tạo đúng cách vào thời gian khởi động ứng dụng và sẽ bị xóa khi người dùng thoát ứng dụng .

tham khảo: http://skillgun.com/question/9849/android-provab/face-to-face-round/if-i-close-the-application-will-it-destroy-all-the-static-variables

0

biến tĩnh hoặc các khối tĩnh không liên quan đến đối tượng. Đây là các biến cấp lớp không liên quan đến đối tượng. Nếu chúng ta phá hủy đối tượng, biến tĩnh sẽ không phá hủy được định nghĩa trong cùng một lớp.Biến tĩnh khởi tạo một lần trong bộ nhớ.

vì vậy khi chúng tôi đóng các đối tượng ứng dụng phá hủy nhưng biến tĩnh không phá hủy. Nhưng khi chúng ta xóa ứng dụng thì phá hủy lớp và biến tĩnh cũng vậy. Đôi khi android giết lớp do không gian bộ nhớ trống trong trường hợp đó biến tĩnh phá hủy.

+0

Bạn không có ý? > Biến tĩnh hoặc khối tĩnh KHÔNG được liên kết với đối tượng. – ajmccall

+0

KHÔNG, ý tôi là các biến tĩnh hoặc các khối tĩnh KHÔNG được liên kết với đối tượng. –

+0

Ok, vui vì chúng tôi đã xóa: / – ajmccall

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