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