看板 AndroidDev 關於我們 聯絡資訊
http://pastebin.com/aATXzZFZ 這是我的程式碼,底下是Log內容 我想請問一下為何我在try catch中可以抓到我需要的東西並add進我的ArrayList內 Log中也能看見name.add()確實有執行。 在listener中的name.isempty()也確實不為空(我有把內容印出來過確定也沒問題) 但是在底下那行txt.setView(name.isempty())就會印出true (我也印過name.toString確實為空) 有辦法能讓name在listener外也不為空嗎? -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 220.134.187.188 ※ 文章網址: https://www.ptt.cc/bbs/AndroidDev/M.1441776636.A.5BA.html
corrupt003: 你自己在setText那麼也加log看是哪時候印出來就知道了 09/09 13:43
corrupt003: 那麼 --> 那邊 09/09 13:44
corrupt003: listener裡的 onResponse是在setText後才執行 09/09 13:45
d93n8311: 現在問題是listener裡面的name沒問題 但是同一個name 09/09 13:47
d93n8311: 到了listener外面就空了 09/09 13:47
passli: 就是執行的順序問題 你先txt.setText 然後才送request 09/09 13:58
jknm0510a: Response是一個thread,程式不會等thread完成才做sette 09/09 13:59
d93n8311: 我將mQueue.add(req)移動到setText前也是empty 09/09 14:00
jknm0510a: ,所以你要把setText寫在裡面,但是又會產生UIThread 09/09 14:00
jknm0510a: 的問題 09/09 14:00
d93n8311: 看來是我對它的理解有誤Q_Q 09/09 14:01
jknm0510a: 總而言之你要在try的後面用handler等方法回到UIThread 09/09 14:02
jknm0510a: 然後在UIThread內做setText動作 09/09 14:03
passli: 寫在裡面,加上 Activity.runOnUiThread 就可以解決了 09/09 14:03
mshockwave: 因為它的request是async的,你要在onResponse裡用hand 09/09 14:58
mshockwave: ler把訊息更新到ui 09/09 14:58
d93n8311: 謝謝各位 我大致了解問題在哪了 09/09 15:13
panjiongkai: name 宣告final 還可以變動? 09/09 15:16
d93n8311: 我後來把它拉去全域變數就改掉了 09/09 15:24
d93n8311: 如果宣告在OnCreate裡面它就會說要宣告成final才可以用 09/09 15:25
d93n8311: 我也不是很了解原因 09/09 15:25
y3k: 宣告成final的意思可以視為"不可以再拿去等於其他東西" 09/09 22:33
jknm0510a: 應該是你要拿進thread內的變數要宣告成final,不能再修 09/10 00:24
jknm0510a: 這是一個保障thread安全性的限制 09/10 00:24
ssccg: 不是thread的關係,是方法中的匿名類別的關係 09/10 02:13
ssccg: inner class會保有enclosing class的object reference 09/10 02:14
ssccg: 但method中的變數在method結束就沒了,所以實作是會copy一 09/10 02:16
ssccg: 份到inner class裡,所以原本的宣告要求final,才不會跟 09/10 02:16
ssccg: copy過去的不一致 09/10 02:16
ssccg: 不在method中的class field就沒這限制 09/10 02:17
jknm0510a: 喔!受教了,感謝 09/10 09:22