[問題] ArrayList被系統自動回收?

看板AndroidDev作者 (別理我)時間10年前 (2015/02/28 17:53), 10年前編輯推噓5(5030)
留言35則, 9人參與, 最新討論串1/1
假設宣告 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

02/28 19:39, , 1F
你的問題不是很清楚,但手機須注意life cycle, 在activity
02/28 19:39, 1F

02/28 19:40, , 2F
創建時init好要用到的資料
02/28 19:40, 2F

02/28 19:44, , 3F
我的經驗是當系統須呼叫onCreate時,這個activity就可能
02/28 19:44, 3F

02/28 19:45, , 4F
被回收掉部份資料
02/28 19:45, 4F

02/28 21:14, , 5F
A.b.c.d賦予值的時機在onCreate
02/28 21:14, 5F

02/28 21:14, , 6F
且採用非同步的方式取得值
02/28 21:14, 6F

02/28 21:15, , 7F
印log看什麼時候被回收掉?
02/28 21:15, 7F

02/28 21:15, , 8F
請問有何方式可以保存值?不被回收呢?
02/28 21:15, 8F

02/28 22:18, , 9F
把reference放在不會被回收的地方,如static或application
02/28 22:18, 9F

02/28 22:19, , 10F
或是在onSaveInstanceState的地方存起來,在onCreate再從
02/28 22:19, 10F

02/28 22:19, , 11F
進來的bundle讀回來
02/28 22:19, 11F

02/28 22:21, , 12F
可是在onCreate中賦值,應該本來就每次都會賦值了吧
02/28 22:21, 12F

02/28 22:22, , 13F
問題可能在你非同步取值有沒有做完,什麼時候做完吧
02/28 22:22, 13F
我已確認過,非同步已經取得值!被賦予spinner 且spinner也可以下拉選擇! 就當在a.get(position)的時候,發生例外 > 原因是 a = null

02/28 23:11, , 14F
不太可能無緣無故被回收 應該是有地方寫錯了吧
02/28 23:11, 14F

02/28 23:12, , 15F
最簡單的就是用final 先把 list init 然後
02/28 23:12, 15F

02/28 23:12, , 16F
onCreate 把值寫入 這樣可以避免不小心設成 null
02/28 23:12, 16F
有些手機上會發生這樣子的情況,但是有些手機並不會發生 ※ 編輯: sweet00914 (114.27.97.30), 03/01/2015 14:23:42

03/01 14:40, , 17F
arraylist掛在activity上 而activity結束生命周期的時
03/01 14:40, 17F

03/01 14:40, , 18F
間並不一定 當系統資源較緊繃時 不用的activity會比較
03/01 14:40, 18F

03/01 14:40, , 19F
快被gc
03/01 14:40, 19F

03/01 14:43, , 20F
暫存資料掛在static也沒意義 整個application被結束回
03/01 14:43, 20F

03/01 14:43, , 21F
收後還是會不見
03/01 14:43, 21F

03/01 14:44, , 22F
應該寫到perferences或db或file 每次開啟先檢查暫存 決
03/01 14:44, 22F

03/01 14:44, , 23F
定是否更新暫存
03/01 14:44, 23F

03/01 14:46, , 24F
暫存在memory只能保證此次執行能用 但你不能保證自己的
03/01 14:46, 24F

03/01 14:46, , 25F
執行何時被系統結束
03/01 14:46, 25F

03/01 14:49, , 26F
不過這邊講的只是概念 實際上我們不知道你程式碼長怎樣
03/01 14:49, 26F

03/01 14:49, , 27F
但沒有「無緣無故回收」這種事 應該要想辦法知道緣故
03/01 14:49, 27F

03/01 17:24, , 28F
當arraylist放在activity內 activity被回收後拿不到
03/01 17:24, 28F

03/01 17:24, , 29F
arraylist 完全是預期內的事
03/01 17:24, 29F

03/01 17:44, , 30F
但我想說的是 在class內直接宣告成final也會有問題?
03/01 17:44, 30F

03/01 17:46, , 31F
沒有有可能只是時機點的問題呢?
03/01 17:46, 31F

03/02 02:13, , 32F
沒有無緣無故被gc +1
03/02 02:13, 32F

03/02 10:12, , 33F
定義先搞懂 1.final 2.gc
03/02 10:12, 33F

03/02 15:26, , 34F
有reference不會被清掉 應該是偶發邏輯錯誤
03/02 15:26, 34F

03/03 01:15, , 35F
發問不附code,此風不可長。有code有真相啦
03/03 01:15, 35F
文章代碼(AID): #1KyP0TzP (AndroidDev)