作者sweet00914 (別理我)
看板AndroidDev
標題[問題] ArrayList被系統自動回收?
時間Sat Feb 28 17:53:31 2015
假設宣告
ArrayList<String> a = new ArrayList <String>;
ArrayList<String> b = new ArrayList <String>;
ArrayList<String> c = new ArrayList <String>;
ArrayList<String> d = new ArrayList <String>;
當 a, b, c被賦予值後, 接著再將d 賦予值後
a原本的值就會變成null
此情況在某些裝置上會發生,在某些裝置上並不會發生。
因此我猜測arraylist a應該是被系統自動回收了?
請問大家對於此情況該如何避免呢?
謝謝
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 114.39.137.106
※ 文章網址: https://webptt.com/m.aspx?n=bbs/AndroidDev/M.1425117213.A.F59.html
1F:推 mozzan: 你的問題不是很清楚,但手機須注意life cycle, 在activity 02/28 19:39
2F:→ mozzan: 創建時init好要用到的資料 02/28 19:40
3F:→ mozzan: 我的經驗是當系統須呼叫onCreate時,這個activity就可能 02/28 19:44
4F:→ mozzan: 被回收掉部份資料 02/28 19:45
5F:→ sweet00914: A.b.c.d賦予值的時機在onCreate 02/28 21:14
6F:→ sweet00914: 且採用非同步的方式取得值 02/28 21:14
7F:→ givemepass: 印log看什麼時候被回收掉? 02/28 21:15
8F:→ sweet00914: 請問有何方式可以保存值?不被回收呢? 02/28 21:15
9F:→ ssccg: 把reference放在不會被回收的地方,如static或application 02/28 22:18
10F:→ ssccg: 或是在onSaveInstanceState的地方存起來,在onCreate再從 02/28 22:19
11F:→ ssccg: 進來的bundle讀回來 02/28 22:19
12F:→ ssccg: 可是在onCreate中賦值,應該本來就每次都會賦值了吧 02/28 22:21
13F:→ ssccg: 問題可能在你非同步取值有沒有做完,什麼時候做完吧 02/28 22:22
我已確認過,非同步已經取得值!被賦予spinner
且spinner也可以下拉選擇!
就當在a.get(position)的時候,發生例外 > 原因是 a = null
14F:→ qweqweqweqwe: 不太可能無緣無故被回收 應該是有地方寫錯了吧 02/28 23:11
15F:→ qweqweqweqwe: 最簡單的就是用final 先把 list init 然後 02/28 23:12
16F:→ qweqweqweqwe: onCreate 把值寫入 這樣可以避免不小心設成 null 02/28 23:12
有些手機上會發生這樣子的情況,但是有些手機並不會發生
※ 編輯: sweet00914 (114.27.97.30), 03/01/2015 14:23:42
17F:→ KeySabre: arraylist掛在activity上 而activity結束生命周期的時 03/01 14:40
18F:→ KeySabre: 間並不一定 當系統資源較緊繃時 不用的activity會比較 03/01 14:40
19F:→ KeySabre: 快被gc 03/01 14:40
20F:→ KeySabre: 暫存資料掛在static也沒意義 整個application被結束回 03/01 14:43
21F:→ KeySabre: 收後還是會不見 03/01 14:43
22F:→ KeySabre: 應該寫到perferences或db或file 每次開啟先檢查暫存 決 03/01 14:44
23F:→ KeySabre: 定是否更新暫存 03/01 14:44
24F:→ KeySabre: 暫存在memory只能保證此次執行能用 但你不能保證自己的 03/01 14:46
25F:→ KeySabre: 執行何時被系統結束 03/01 14:46
26F:→ KeySabre: 不過這邊講的只是概念 實際上我們不知道你程式碼長怎樣 03/01 14:49
27F:→ KeySabre: 但沒有「無緣無故回收」這種事 應該要想辦法知道緣故 03/01 14:49
28F:→ qweqweqweqwe: 當arraylist放在activity內 activity被回收後拿不到 03/01 17:24
29F:→ qweqweqweqwe: arraylist 完全是預期內的事 03/01 17:24
30F:推 qweqweqweqwe: 但我想說的是 在class內直接宣告成final也會有問題? 03/01 17:44
31F:→ qweqweqweqwe: 沒有有可能只是時機點的問題呢? 03/01 17:46
32F:推 beyondthe: 沒有無緣無故被gc +1 03/02 02:13
33F:→ KeySabre: 定義先搞懂 1.final 2.gc 03/02 10:12
34F:推 gpc: 有reference不會被清掉 應該是偶發邏輯錯誤 03/02 15:26
35F:推 lovelycateye: 發問不附code,此風不可長。有code有真相啦 03/03 01:15